一、定义
定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。
策略模式的重点就是封装角色,它借用代理模式的思路。差别就是策略模式的封装角色和被封装的策略类不用是同一个接口,如果是同一个接口那就成为了代理模式。
- 优点:算法可以自由切换、
避免使用多重条件判断、扩展性良好。 - 缺点:策略类数量多、需要对外暴露。
二、实现
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);
}
网友评论