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);
        }
        
    }

     

     学习资料:

      <设计模式之禅>

     

     

    人生没有彩排,每一天都是现场直播
  • 相关阅读:
    关于==和equals的区别和联系,面试这么回答就可以
    (附运行结果和截图)关于try{return}finally中都有return 运行结果测试之旅
    [已解决]踩过的坑之mysql连接报“Communications link failure”错误
    JVM虚拟机----运行时数据区-------方法区
    JVM虚拟机------运行时数据区------堆
    JVM虚拟机-----运行时数据区-----本地方法栈
    JVM虚拟机栈------运行时数据区------方法的调用
    JVM虚拟机-----运行时数据区------动态链接
    JVM虚拟机栈------运行时数据区-------栈顶缓存技术
    JVM虚拟机-----运行时数据区-----JVM虚拟机栈-----操作数栈
  • 原文地址:https://www.cnblogs.com/timfruit/p/11121410.html
Copyright © 2011-2022 走看看