设计模式-策略模式

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()方法
这样,测试时,不管我怎么换具体的实现,测试的代码是不用变的
回过头来在品一下,策略模式封装变化,让他们之间可以互相替换
你理解了吗?
浙公网安备 33010602011771号