一、模式解析

  策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

  策略模式的关键点为:

  1、多种算法存在

  2、算法继承同样的接口,执行同样的行为,为可以替代的

  3、算法调用者唯一,算法调用者可以灵活改变自己需要调用的算法,从而实现计算。

二、模式代码

算法接口:

/**
* 算法统一接口,所有算法继承此接口
* @author zjl
* @time 2016-1-24
*
*/
public interface IStrategy {
public void opration();
}

算法具体实现1:

public class StrategyA implements IStrategy {
@Override
public void opration() {
System.out.println("策略A正在执行");
}
}

算法具体实现2:

public class StrategyB implements IStrategy {
@Override
public void opration() {
System.out.println("策略B正在执行");
}
}

算法持有者和调用者

/**
* 算法持有者,通过创建此对象创建算法,并执行算法运算
* @author zjl
*
*/
public class Context {
private IStrategy strategy;
public Context(IStrategy strategy){
this.strategy=strategy;
}
public void execute(){
this.strategy.opration();
}
}

客户端调用程序:

public class Client {
public static void main(String[] args) {
Context context=new Context(new StrategyA());
context.execute();//策略A正在执行
}
}

三、应用场景

策略模式主要侧重于计算,在工作中涉及到银行软件中,最为明显的就是手续费计算,根据不同客户的要求,有些客户要求所有手续费由渠道系统进行计算,有些要求由核心统一计算后提供给渠道,所以就会存在不同客户使用时候进行替换。

四、应用代码

/**
* 手续费查询接口
* @author zjl
*/
public interface IFee {
public int getFee();
}
public class FeeFromLocal implements IFee {
@Override
public int getFee() {
System.out.println("通过本地计算手续费");
return 100;
}
}
/**
* 从核心获取手续费
* @author zjl
*
*/
public class FeeFromRemote implements IFee {
@Override
public int getFee() {
System.out.println("正在从核心获取手续费");
return 100;
}
}

转账交易时候要求计算手续费,此处转账流程略:

public class Transfer {
private IFee feeImpl;
public void setIFee(IFee feeImpl){
this.feeImpl=feeImpl;
}
public void execute(){
System.out.println("转账开始。。。。");
int fee=feeImpl.getFee();
System.out.println("手续费为:"+fee);
System.out.println("转账完成。。。。");
}
}

客户端调用方法,可以是网银或者手机发起

public class Client {
public static void main(String[] args) {
Transfer transfer=new Transfer();
transfer.setIFee(new FeeFromRemote());//项目中手续费计算方式通常由框架进行注入
transfer.execute();
}
}

五、与其他模式关系

1、如果此持有者和策略继承同一个接口,那么策略模式将变为代理模式
   但策略模式和代理模式含义不同,应用场景也不同,代理模式的代理者与被代理这拥有同样的性质和方法
2、通过扩展持有者,使持有者形成抽象类,然后实现多个具体持有者,策略模式可以转化为桥接模式
3、策略模式侧重于封装算法

  

[工作中的设计模式]策略模式stategy的更多相关文章

  1. 在商城系统中使用设计模式----策略模式之在spring中使用策略模式

    1.前言: 这是策略模式在spring中的使用,对策略模式不了解对同学可以移步在商城中简单对使用策略模式. 2.问题: 在策略模式中,我们创建表示各种策略的对象和一个行为,随着策略对象改变而改变的 c ...

  2. [工作中的设计模式]原型模式prototype

    一.模式解析 提起prototype,最近看多了js相关的内容,第一印象首先是js的原型 var Person=function(name){ this.name=name; } Person.pro ...

  3. [工作中的设计模式]解释器模式模式Interpreter

    一.模式解析 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 以上是解释器模式的类图,事实上我 ...

  4. [工作中的设计模式]中介模式模式Mediator

    一.模式解析 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 中介模式又叫调停者模式,他有如下特点: 1.有多个系统或者对 ...

  5. [工作中的设计模式]桥接模式bridge

    一.模式解析: 策略模式一节讲过,通过扩展持有者,使持有者形成抽象类,然后实现多个具体持有者,策略模式可以转化为桥接模式. 桥接模式定义为:将抽象部分与实现部分分离,使它们都可以独立的变化,在软件系统 ...

  6. [工作中的设计模式]备忘录模式memento

    一.模式解析 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把 ...

  7. [工作中的设计模式]建造者模式builder

    一.模式解析 建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心. 以上是对建造者模式的官方定义,简单说就是对于复杂对象 ...

  8. [工作中的设计模式]组合模式compnent

    一.模式解析 将对象组合成树形结构以表示“部分整体”的层次结构.组合模式使得用户对单个对象和使用具有一致性. 组合模式的要点是: 1.对象整体以树形层次结构进行展示 2.树的根节点和子节点均可以添加删 ...

  9. [Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

随机推荐

  1. eclipse下使用git下载和上传项目

    简单配置,填入我们的用户名和邮箱 >>Preferences>Team>Git>Configuration 点击Add Entry,在弹出框里面输入key和value的值 ...

  2. 【Git】自定义Git

    来源:廖雪峰 让Git显示颜色 git config --global color.ui true 忽略特殊文件 有些文件有敏感信息,或者是自动生成的中间文件.不能或不必提交到git,可以用.giti ...

  3. ocx文件转换成C#程序引用的DLL

    将ocx文件转换成C#程序引用的DLL文件的办法  将ocx文件转换成C#程序引用的DLL文件的办法,需要的朋友可以参考一下  1.打开VS2008或VS2010命令提示符(此例用VS2008) 将o ...

  4. JavaScript prototype应用

    //JavaScript自定义功能 //1,去除字符串两端空格 String.prototype.trim = function() { var start, end; start = 0; end  ...

  5. C# webBrowser控件使用

    C# webBrowser控件使用心得 最近用到WebBrowser控件,遇到很多问题,也学习了不少新的东西.下面是我在C#下写的关于WebBrowser控件使用的代码. 1.WebBrowser常用 ...

  6. WEB前端开发学习:源码canvas 雪

    WEB前端开发学习:源码canvas 雪 双旦节要到了,程序员们为了响应气氛,特别用代码制作了动态雪花,WEB前端开发学习的初学者们一起跟着案例做一遍吧! <!DOCTYPE html> ...

  7. Java -- String、StringBuffer、StringBuilder

    原文:http://blog.csdn.net/kingzone_2008/article/details/9220691 String:不可变. StringBuffer(JDK1.0):可变,线程 ...

  8. 数据结构和算法 – 6.构建字典: DictionaryBase 类和 SortedList 类

      6.1.DictionaryBase 类的基础方法和属性 大家可以把字典数据结构看成是一种计算机化的词典.要查找的词就是关键字,而词的定义就是值. DictionaryBase 类是一种用作专有字 ...

  9. EF – 2.EF数据查询基础(上)查询数据的实用编程技巧

    目录 5.4.1 查询符合条件的单条记录 EF使用SingleOrDefault()和Find()两个方法查询符合条件的单条记录. 5.4.2 Entity Framework中的内部数据缓存 DbS ...

  10. Linq to json

    Json.Net系列教程 4.Linq To JSON 一.Linq to JSON是用来干什么的? Linq to JSON是用来操作JSON对象的.可以用于快速查询,修改和创建JSON对象.当JS ...