美文网首页
策略模式

策略模式

作者: wxz1997 | 来源:发表于2018-09-20 15:27 被阅读0次

    一、定义

    定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
    策略模式的重点就是封装角色,它借用代理模式的思路。差别就是策略模式的封装角色和被封装的策略类不用是同一个接口,如果是同一个接口那就成为了代理模式。

    1. 优点:算法可以自由切换、
      避免使用多重条件判断、扩展性良好。
    2. 缺点:策略类数量多、需要对外暴露。

    二、实现

    public class Client {
        public static void main(String[] args) {
            //声明一个具体的策略
            Strategy strategy = new ConcreteStrategy1();
            //声明上下文对象
            Context context = new Context(strategy);
            //执行封装后的方法
            context.doAnythinig();
        }
    }
    
    //抽象策略角色
    interface Strategy {
        //策略模式的运算法则
        void doSomething();
    }
    
    //具体策略角色
    class ConcreteStrategy1 implements Strategy {
        public void doSomething() {
            System.out.println("具体策略1的运算法则 ");
        }
    }
    
    class ConcreteStrategy2 implements Strategy {
        public void doSomething() {
            System.out.println("具体策略2的运算法则");
        }
    }
    
    //封装角色
    class Context {
        //抽象策略
        private Strategy strategy = null;
        //构造函数设置具体策略
        public Context(Strategy strategy){
            this.strategy = strategy;
        }
        //封装后的策略方法
        public void doAnythinig(){
            this.strategy.doSomething();
        }
    }
    

    三、使用lambda表达式简化

    package cn.wxz1997.mall;
    
    
    import java.util.function.Supplier;
    
    /**
     * @Description: 模板模式
     * @Author: wxz1997
     * @Date 18-9-15下午8:21
     */
    public class Client {
        public static void main(String[] args) {
            //使用Lambda表达式
            Context context = new Context(()-> System.out.println("Hello!"));
            context.doAnythinig();
        }
    }
    
    //抽象策略角色
    interface Strategy {
        //策略模式的运算法则
        void doSomething();
    }
    
    
    //封装角色
    class Context {
        //抽象策略
        private Strategy strategy = null;
        //构造函数设置具体策略
        public Context(Strategy strategy){
            this.strategy = strategy;
        }
        //封装后的策略方法
        public void doAnythinig(){
            this.strategy.doSomething();
        }
    }
    

    四、策略枚举

    public class Client {
        public static void main(String[] args) {
            System.out.println(Calculator.ADD.exec(1, 2));
        }
    }
    
    enum Calculator {
        //加法运算
        ADD("+"){
            public int exec(int a,int b){
                return a + b;
            }
        },
        //减法运算
        SUB("-"){
            public int exec(int a,int b){
                return a - b;
            }
        };
        String value = "";
        //定义成员值类型
        Calculator(String value){
            this.value = value;
        }
        //获得枚举成员的值
        public String getValue(){
            return this.value;
        }
        //声明一个抽象函数
        public abstract int exec(int a,int b);
    }
    

    相关文章

      网友评论

          本文标题:策略模式

          本文链接:https://www.haomeiwen.com/subject/zmcnnftx.html