设计模式之策略模式

策略模式

它定义了算法家族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的客户。

//提供一个算法的通用接口
interface  Strategy{
     void Algorithm();
}

//具体算法的不同实现
class  StrategyA implements Strategy{

    @Override
    public void Algorithm() {
        System.out.println("算法A的具体实现");
    }
}


class  StrategyB implements Strategy{

    @Override
    public void Algorithm() {
        System.out.println("算法B的具体实现");
    }
}

class  StrategyC implements Strategy{

    @Override
    public void Algorithm() {
        System.out.println("算法C的具体实现");
    }
}
//通过创建Context对象来创建不同的算法对象
class Context{
    Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    //根据不同的算法对象调用其算法的方法
    public void ContextInterface(){
        strategy.Algorithm();
    }
}

public class Client {
    public static void main(String[] args) {
      Context context;
        context = new Context(new StrategyA());
        context.ContextInterface();

        context = new Context(new StrategyB());
        context.ContextInterface();

        context = new Context(new StrategyC());
        context.ContextInterface();
    }
}

接下来我们将策略模式和简单工厂模式结合一下,其实大部分代码都是一样的:

//提供一个算法的通用接口
interface  Strategy{
     void Algorithm();
}

//具体算法的不同实现
class  StrategyA implements Strategy{

    @Override
    public void Algorithm() {
        System.out.println("算法A的具体实现");
    }
}


class  StrategyB implements Strategy{

    @Override
    public void Algorithm() {
        System.out.println("算法B的具体实现");
    }
}

class  StrategyC implements Strategy{

    @Override
    public void Algorithm() {
        System.out.println("算法C的具体实现");
    }
}

//通过创建Context对象来创建不同的算法对象
class Context{

    Strategy strategy =null;

    public Context(String str) //此时传入的就不是具体的算法对象了,而是一个字符串,表示一个具体的算法对象
    {
       switch (str){
           case "A":
               strategy = new StrategyA();break;
           case "B":
               strategy = new StrategyB();break;
           case "C":
               strategy = new StrategyC();break;
       }

    }

    public void ContextInterface(){
        strategy.Algorithm();
    }
}

public class Client {
    public static void main(String[] args) {
        Context context;
        context = new Context("A");
        context.ContextInterface();

        context = new Context("B");
        context.ContextInterface();

        context = new Context("C");
        context.ContextInterface();

    }

}

对比上述两种方法,下面这种方式客户端只需要认识Context类就可以了连算法的父类Strategy都不必去管,这使得算法和客户端彻底分离,耦合更低了。

posted @ 2020-09-27 22:22  xxgbl  阅读(131)  评论(0)    收藏  举报