
Strategy:抽象出要做什么
ConcreteStrategyA,ConcreteStrategyB,ConcreteStrategyC:具体的实现,实现出要做的事情,
Context:维护一个对Strategy对象的引用。可定义一个接口来让Strategy访问它的数据。
策略模式的定义:定义算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户。
定义算法家族-Strategy,抽象出做什么
分别封装起来-ConcreteStrategyA,ConcreteStrategyB,ConcreteStrategyC 每种算法都封装起来
相互替换-Context:维护一个对Strategy对象的引用
仔细品这三行话,就能理解为什么说策略模式是封装变化的。
给个例子:
/**
* @author wrj
* @description
* @Date 2021/12/2 4:02 下午
*/
//抽象出要说什么
interface SaySomeThing{
public void say();
}
//真的要说什么1
class SayOne implements SaySomeThing{
@Override
public void say() {
System.out.println("吔屎啦,梁非凡");
}
}
//真的要说什么2
class SayTwo implements SaySomeThing{
@Override
public void say() {
System.out.println("你知道我这五年是怎么过的吗?");
}
}
//将说什么封装起来,对外暴露一个方法,内部自己去调真正说什么
class SayContext{
private SaySomeThing say;
public SayContext(SaySomeThing say) {
this.say = say;
}
public void contextInterface(){
say.say();
}
}
public class StrategyTest2{
public static void main(String[] args) {
SayContext context1 = new SayContext(new SayOne());
context1.contextInterface();
SayContext context2 = new SayContext(new SayTwo());
context2.contextInterface();
}
}
例子中 我定义了一个说点什么的接口
之后定义了两个说什么的实现
然后定义了context类,引用一个SaySomeThing的实例,并且提供一个接口,去调用实例中的say()方法
这样,测试时,不管我怎么换具体的实现,测试的代码是不用变的
回过头来在品一下,策略模式封装变化,让他们之间可以互相替换
你理解了吗?