浅谈Java设计模式——策略模式(Strategy)
一、概述
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。策略模式就是定义了算法族,分别封装起来,让他们之前可以互相转换,此模式然该算法的变化独立于使用算法的客户。在策略模式中它将这些解决问题的方法定义成一个算法群,每一个方法都对应着一个具体的算法,这里的一个算法我就称之为一个策略。虽然策略模式定义了算法,但是它并不提供算法的选择,即什么算法对于什么问题最合适这是策略模式所不关心的,所以对于策略的选择还是要客户端来做。客户必须要清楚的知道每个算法之间的区别和在什么时候什么地方使用什么策略是最合适的,这样就增加客户端的负担。同时策略模式也非常完美的符合了“开闭原则”,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活地增加新的算法或行为。但是一个策略对应一个类将会是系统产生很多的策略类。
二、使用场景
1.许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
2.需要使用一个算法的不同变体。
3.算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
4.一个类定义了多种行为,并且这些行为在这个类的操作中以多个条件语句的形式出现。 将相关的条件分支移入它们各自的Strategy类中以 代替这些条件语句。
三、参与者
1.Strategy 定义所有支持的算法的公共接口。Context使用这个接口来调用某ConcreteStrategy定义的算法。
2.ConcreteStrategy 以Strategy接口实现某具体算法。
3.Context 用一个ConcreteStrategy对象来配置。 维护一个对Strategy对象的引用。 可定义一个接口来让Stategy访问它的数据。
四、类图
五、示例代码
1.Strategy
/**
* Strategy
* @author zhipeng_Tong
*/
public abstract class Strategy {
public abstract void method();
}
2.ConcreteStrategy
/**
* ConcreteStrategy
* @author zhipeng_Tong
*/
public class StrategyImplA extends Strategy {
@Override
public void method() {
System.out.println("方法 A");
}
}
/**
* ConcreteStrategy
* @author zhipeng_Tong
*/
public class StrategyImplB extends Strategy {
@Override
public void method() {
System.out.println("方法 B");
}
}
/**
* ConcreteStrategy
* @author zhipeng_Tong
*/
public class StrategyImplC extends Strategy {
@Override
public void method() {
System.out.println("方法 C");
}
}
3.Context
/**
* Context
* @author zhipeng_Tong
*/
public class Context extends Strategy {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
@Override
public void method() {
if (strategy != null)
strategy.method();
}
}
4.Client:
public class Client {
public static void main(String[] args) {
Context context;
context = new Context(new StrategyImplA());
context.method();
context = new Context(new StrategyImplB());
context.method();
context = new Context(new StrategyImplC());
context.method();
}
}
运行结果
方法 A
方法 B
方法 C