• 学习设计模式


    策略模式

    一、定义

       定义一组算法,将每个算法都封装起来,并且使它们之前可以相互转换。(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);
        }
        
    }

     

     学习资料:

      <设计模式之禅>

     

     

    人生没有彩排,每一天都是现场直播
  • 相关阅读:
    switch能否作用在作用在byte、long、string上面?
    websocket(转)
    equal和hashcode、==
    List常用方法
    String,Integer,Double等类型互相转换
    BigDecimal的转换和使用
    gitHub常用命令和技巧
    SQL语句
    SpringBoot注解
    vue格式化时间
  • 原文地址:https://www.cnblogs.com/timfruit/p/11121410.html
Copyright © 2020-2023  润新知