[工作中的设计模式]策略模式stategy

一、模式解析

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

  策略模式的关键点为:

  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、策略模式侧重于封装算法

  

时间: 2024-08-01 22:47:13

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

转:多篇文章中的设计模式-------策略模式

DRY原则和设计模式 前两天在做统计程序时,需要读取linux中的日志文件,在网上查了下,就有了结论,于是,根据需要,我写下了这样的代码: [java] view plaincopy public class dealFile { public static void dealContent(String[] commands){ BufferedReader reader=null; try{ Process process = Runtime.getRuntime().exec (comma

在商城系统中使用设计模式----策略模式

1.概念: 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式. 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象.策略对象改变 context 对象的执行算法. 2.注意: 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护. 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为. 注意事项:如果一个系统的策略多于四个,就需要考虑使用

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

一.模式解析 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 以上是解释器模式的类图,事实上我很少附上类图,但解释器模式确实比较抽象,为了便于理解还是放了上来,此模式的要点是: 1.客户端提供一个文本.表达式或者其他,约定解析格式 2.针对文本中可以分为终结符表达式和非终结符表达式, 3.终结符表达式无需进一步解析,但仍需要转化为抽象接口的实例 4.针对非终结表达式,没一种标示需要定义一种解

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

一.模式解析: 策略模式一节讲过,通过扩展持有者,使持有者形成抽象类,然后实现多个具体持有者,策略模式可以转化为桥接模式. 桥接模式定义为:将抽象部分与实现部分分离,使它们都可以独立的变化,在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,使用桥接模式可以应对多维度的变化. 主要有两个要点 1.有两个维度的变化,彼此的变化应该不会受到对方的干扰 2.通过接口进行关联,共有n*m种组合 3.其中一个维度,保存这另外一个维度的引用 二.模式代码: 维度一 interface Impl

[工作中的设计模式]模板模式

一.模式解析 准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑.不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现.这就是模板方法模式的用意 模板模式的关键点为: 1.有一个父类,将整体业务逻辑和公用方法进行封装: 2.父类将具体的有差异的业务定义为抽象方法: 3.子类继承父类后,实现这些抽象方法,完成对自己业务流程的: 4.子类不可以改变父类的整体业务逻辑流程: 5.子类也可以覆盖父类中其他方法,实现定制化业务

ruby中的设计模式--策略模式

模板模式固然不错,但其还是有一些缺陷的.比如其实现依赖于继承并且缺足够的灵活性.在这时候我们就需要找到一个更加优化的解决方案——策略模式. 下面是使用策略模式实现的Report模板 1 # 策略1 2 class HTMLFormatter 3 def output_report title, text 4 puts '<html>' 5 puts ' <head>' 6 puts ' <title>' + title + '</title>' 7 puts

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

一.模式解析 提起prototype,最近看多了js相关的内容,第一印象首先是js的原型 var Person=function(name){ this.name=name; } Person.prototype.run=function(){ alert(this.name+" is running"; } 此处的原型是js的特殊定义,在原型上定义的属性和方法所有的类进行共享. 不过设计模式中的原型模式指的是:将已有的对象作为原型,拷贝出一份具有相同属性的新的对象. 模式定义为:原型

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

一.模式解析 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态.备忘录模式常常与命令模式和迭代子模式一同使用. 备忘录模式可以根据客户指令,将相应的对象特有属性进行快照,如果客户要恢复对象,则根据快照提供的特有属性进行还原. 二.模式代码 package memento.patten; /** *备忘录类,同时指定要保存的对象属性

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

一.模式解析 将对象组合成树形结构以表示“部分整体”的层次结构.组合模式使得用户对单个对象和使用具有一致性. 组合模式的要点是: 1.对象整体以树形层次结构进行展示 2.树的根节点和子节点均可以添加删除子节点,叶子节点无子节点 3.可以通过节点的行为动作调用并展示他所有自己点的行为 4.为了方便的实现无限节点的扩展,我们通常定义一个公共的接口,所有子节点和叶子节点均实现此接口 二.模式代码 1.公共接口,供所有子节点和叶子节点实现 package component.patten; public