学习设计模式 - 策略模式

策略模式

一、定义

   定义一组算法,将每个算法都封装起来,并且使它们之前可以相互转换。(Define a family of algorithms, encapsulate each one, and make them interchangeable.)

 

 二、理解

   单独抽取独自变化的行为,定义相应接口,实现并封装对应的行为,使得它们可以相互替换。

  

  1. Context上下文角色

    起承上启下的封装作用, 屏蔽高层对策略丶算法的直接访问, 封装可能的变化

  2. Strategy策略接口

    定义策略的接口

  3. ConreteStrategy具体策略

     实现策略接口,封装具体的算法

 

 三、举例

  

  3.1) 定义策略接口

/**
 * 策略
 * @author TimFruit
 * @date 2019/5/21 7:40
 */

public interface IAlgorithm {

    int doOperate(int num1, int num2);
    
}

   

  3.2) 实现策略接口

public class Add implements IAlgorithm {
    @Override public int doOperate(int num1, int num2) {
        return num1+num2;
    }
}

 

public class Multiply implements IAlgorithm {
    @Override public int doOperate(int num1, int num2) {
        return num1 * num2;
    }
}

 

   3.3) 实现上下文

/**
 * 上下文,承载算法
 * 
 * @author TimFruit
 * @date 2019/5/21 8:03
 */

public class Calculator {
    IAlgorithm algorithm;

    public Calculator(IAlgorithm algorithm) {
        this.algorithm = algorithm;
    }
    
    public int exec(int num1, int num2){
        return algorithm.doOperate(num1, num2);
    }
}

 

  3.4) 测试场景

public class Client {
    public static void main(String[] args) {
        IAlgorithm algorithm=new Add();
        
        Calculator calculator =new Calculator(algorithm);
        
        int num1=1;
        int num2=3;
        int result= calculator.exec(num1, num2);
        System.out.println("结果为: "+ result);
    }
}

 

 

 四丶策略枚举

  

/**
 * 策略枚举
 * 
 * 很优秀,但一般用于不经常变化的角色,因为受限于枚举类型 (拓展性非常差 T_T )
 * 
 * @author TimFruit
 * @date 2019/5/21 8:12
 */

public enum  Calculator {
    
    ADD {
        @Override int exec(int num1, int num2) {
            return num1+num2;
        }
    },
    SUB {
        @Override int exec(int num1, int num2) {
            return num1-num2;
        }
    },
    MULTIPLY {
        @Override int exec(int num1, int num2) {
            return num1 * num2;
        }
    };
    
    
    
    abstract int exec(int num1, int num2);
    
}

 

  测试环境:

public class Client {

    public static void main(String[] args) {
        int num1=1;
        int num2=3;
        
        int result=Calculator.ADD.exec(num1, num2);
        System.out.println("结果为: "+ result);
    }
    
}

 

 

 学习资料:

  <设计模式之禅>

 

 

 

posted @ 2019-08-24 15:58  timfruit  阅读(201)  评论(0编辑  收藏  举报