策略模式

2018-09-20  本文已影响0人  wxz1997

一、定义

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

  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);
}
上一篇下一篇

猜你喜欢

热点阅读