zoukankan      html  css  js  c++  java
  • 学习设计模式

    策略模式

    一、定义

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

     

     学习资料:

      <设计模式之禅>

     

     

    人生没有彩排,每一天都是现场直播
  • 相关阅读:
    C#中 时间戳与普通时间格式的转换
    关于Litjson的简单使用
    Unity 前端开发积累 第二篇
    《大话数据结构》--- 第六章 树
    《大话数据结构》--- 第五章 串
    获取RDP连接中密码的方法
    CMD打包文件,解压文件
    泛微OA7.0下载7.1下载
    [ASP.NET]书店后台开发-模板页
    [JSP]用户注册
  • 原文地址:https://www.cnblogs.com/timfruit/p/11121410.html
Copyright © 2011-2022 走看看