设计模式-策略模式

来源:互联网 发布:滑坡灾害数据 编辑:程序博客网 时间:2024/06/16 04:15

           最近在很多场合都看见设计模式的影子,一直以来,都投入主要时间在搞算法与数据结构,很来发现设计模式真的很重要。有的时候代码的可维护、可重用、可扩展确实胜过单纯的算法效率高。所以拾起大牛书籍《大话设计模式》同时参考网上诸大牛的博客,开始我的设计模式之旅。

        今天先介绍一下策略模式。

概念:

       定义了算法簇,分别封装起来,让它们之间可以相互替换,此模式让算法的变换不会想象到使用算法的客户。

流程:

      第一步:抽象策略角色(策略类,通常由一个接口或者抽象类实现)
      第二步:具体策略角色(实现相关的算法和行为的具体类)

      第三步:环境角色(持有一个策略类的引用,最终给客户端调用)

优缺点:   

    1.优点:
        (1)、使用组合替代继承,更灵活(算法独立,可以任意扩展);
        (2)、客户不需要知道策略、算法的实现细节;
        (3)、使用策略模式可以避免使用多重条件(if-else)语句。
    2.缺点:
          (1)、客户端必须知道所有的策略类,并自行决定使用哪一个策略类,这点有同于简单工厂模式。
 
示例代码
package Pattern;import java.util.Scanner;interface Operation// 父类接口{public int GetResult(int opA, int opB);}class AddOperation implements Operation {public int GetResult(int opA, int opB) {return opA + opB;}}class SubOperation implements Operation {public int GetResult(int opA, int opB) {return opA - opB;}}class MulOperation implements Operation {public int GetResult(int opA, int opB) {return opA * opB;}}class StrategyMethod {private Operation myOperation;public StrategyMethod(Operation tempOperation) {myOperation = tempOperation;}public StrategyMethod() {myOperation = null;}public int GetResult(int opA, int opB) {return myOperation.GetResult(opA, opB);}}public class Pattern {public static void main(String[] args) {try {Scanner input = new Scanner(System.in);int opA, opB, result;opA = input.nextInt();opB = input.nextInt();String op = "*";StrategyMethod strategy = new StrategyMethod();if (op.equals("+")) {strategy = new StrategyMethod(new AddOperation());result = strategy.GetResult(opA, opB);System.out.println(result);} else if (op.equals("-")) {strategy = new StrategyMethod(new SubOperation());result = strategy.GetResult(opA, opB);System.out.println(result);} else if (op.equals("*")) {strategy = new StrategyMethod(new MulOperation());result = strategy.GetResult(opA, opB);System.out.println(result);}} catch (Exception e) {e.printStackTrace();}}}


 

0 0
原创粉丝点击