天天看点

设计模式-策略模式

设计模式-策略模式

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()方法

这样,测试时,不管我怎么换具体的实现,测试的代码是不用变的

回过头来在品一下,策略模式封装变化,让他们之间可以互相替换

你理解了吗?