Java23种设计模式案例:策略模式(strategy)

 

  现实生活中,咱们要作一件事情或者完成某项工做,每每有不少种途径。好比咱们出游,能够选择坐汽车,坐火车,土豪点的选择是坐飞机。还有咱们如今线下的支付方式也有了不少种选择,之前在外面忘了带钱的话可能一瓶水都难以买到,如今只要咱们手机在身上,能够用微信或者支付宝。java

  在软件设计层面,咱们把各类支付方式叫作策略。若是不考虑设计模式的话,咱们可能会在一个类中用if..else方式来选择支付方式,即程序员

if(type == 1){
     //微信支付   
   
}else if(type == 2){
     // 支付宝支付

}else if(type == 3){
    //现金支付  

}

        但若是之后要改变支付方式,好比不能用微信支付了,或者新增了其余支付方式,咱们就要改变这个类,这会带来代码维护的麻烦。算法

1、适用场景

  1.若是一个系统里有不少类,他们只是某个行为不一样时,使用策略模式可让一个对象在许多行为中选择一种行为。编程

  2.一个系统须要动态地在几种算法中选择一种。设计模式

  3.有多重转移条件语句考试使用策略模式。bash

2、优势和缺点

  1.优势

  (1).体现了“对修改关闭,对扩展开放”原则,客户端增长行为不用修改原有代码,只要添加一种策略便可。微信

  (2).避免了使用多重转移语句(if..else if..else)。学习

  (3).提供了能够替换继承关系的办法: 继承提供了另外一种支持多种算法或行为的方法。你能够直接生成一个Context类的子类,从而给它以不一样的行为。但这会将行为硬行编制到 Context中,而将算法的实现与Context的实现混合起来,从而使Context难以理解、难以维护和难以扩展,并且还不能动态地改变算法。最后你获得一堆相关的类 , 它们之间的惟一差异是它们所使用的算法或行为。 将算法封装在独立的Strategy类中使得你能够独立于其Context改变它,使它易于切换、易于理解、易于扩展。测试

  2.缺点

  (1).每添加一个策略就要增长一个类,当策略过可能是会致使类数目庞大。微信支付

  (2).客户端需明确知道系统有哪些策略可使用,当策略过多时客户端的学习成本较高。

3、代码示例

  一、结构图

  

  从图中咱们看到,客户context拥有成员变量strategy(策略),至于须要用到那种策略,咱们能够在构造器中指定。策略模式的定义是:定义算法族,分别封装起来,让他们之间能够互相替换,此模式让算法的变化独立于使用算法的客户。这算法体现了几个设计原则,第1、把变化的代码从不变的代码中分离出来;第2、针对接口编程而不是具体类(定义了策略接口);第3、多用组合,少用继承(客户经过组合方式使用策略)。

        二、代码实现

  下面以公司职员的工做内容为例介绍策略模式

  定义策略接口,就是工做内容

interface DoWorking{

    public void comeOn();

}

 

  编码类实现策略接口DoWorking

class Coding implements DoWorking{

    public void comeOn(){

        System.out.println("I'm coding....");

    }

}

  审计类实现策略接口DoWorking

class auditing implements DoWorking{

    public void comeOn(){

        System.out.println("我正在审计财务报表....");

    }

}

 

  招聘类实现策略接口DoWorking

class recruiting implements DoWorking{

    public void comeOn(){

        System.out.println("I'm recruting new employees...");

    }

}

  

  定义客户端职员类,其中包含成员变量doWorking(策略),以及开展工做的方法startWork() 

class Employee{

    public DoWorking doWorking;//组合的方式使用策略

    public void startWork(){

        doWorking.comeOn();

    }

}

 

 客户端程序员继承职员类

class Coder extend Employee{

    public Coder(){

       doWorking = new Coding();//使用编码策略

    }

}

 测试程序员调用策略

public class StrategyClient {
    public static void main(String[] args){
        Employee coder = new Coder();
        coder.startWork();
    }
}

  运行结果:I'm coding.... 

相关文章
相关标签/搜索