设计模式之策略模式

定义(百度百科):
       策略模式是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

具体代码:

public class Client {
    public static void main(String[] args) {
        Strategy strategyA = new StrategyA();
        Strategy strategyB = new StrategyB();
        Context context = new Context(strategyA);
        context.operation();
        context = new Context(strategyB);
        context.operation();
    }
}

public class Context {

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

    void operation() {
        strategy.operation();
    }
}

public interface Strategy {
    void operation();
}

public class StrategyA implements Strategy {

    @Override
    public void operation() {
        System.out.println("算法A");
    }
}

public class StrategyB implements Strategy {

    @Override
    public void operation() {
        System.out.println("算法B");
    }
}

模块说明:

Context:是使用不同算法的角色,它在解决某个问题(即实现某个方法)时可以采用多种策略。在环境类中维持一个对抽象策略类的引用实例(Strategy),用于定义所采用的策略。

Strategy:它为所支持的算法声明了抽象方法,是所有策略类的抽象,它可以是接口,抽象类或具体类。环境类(Context)通过抽象策略类中声明的方法在运行时调用具体策略类中实现的算法。

StrategyA与StrategyB之类:它实现了在抽象策略类中声明的算法,在运行时,具体策略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务处理。

适用场景:
1.多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
2.需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
3.对客户隐藏具体策略(算法)的实现细节,彼此完全独立。

优缺点:
优点:
定义了一些列算法类。
避免多重条件语句。
提供了更好的扩展性。

缺点:
客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
策略模式将造成系统产生很多具体策略类。
无法同时在客户端使用多个策略类。

总结:分离算法,选择实现。

原文地址:https://www.cnblogs.com/daily-note/p/7510424.html