- 策略模式定义
策略模式是一种比较简单的设计模式,也叫做政策模式,策略模式的核心就是面向对象的继承和多态机制。Define a family of algorithms, encapsulate each one, and make them interchangeable. 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。 - 策略模式通用类图

策略模式的三个角色:- Context封装角色:起到承上启下的作用。屏蔽了高层模块对策略、算法的直接访问。
- Strategy抽象策略角色:策略、算法的抽象,通常为借口,定义每个策略、算法必须有的方法和属性。
- ConcreteStrategy具体策略角色:实现 Strategy抽象策略角色,包含具体的算法。
- 策略模式通用代码
抽象策略借口
public interface Strategy {
void sth();
}
封装角色
public class Context {
private Strategy strategy = null;
public Context(Strategy _strategy) {
this.strategy = _strategy;
}
/**
* 封装后的策略方法
*/
public void doAnything() {
this.strategy.sth();
}
}
具体策略实现
public class ConcreteStrategy1 implements Strategy{
@Override
public void sth() {
System.out.println("策略算法实现1。。。");
}
}
public class ConcreteStrategy2 implements Strategy{
@Override
public void sth() {
System.out.println("策略算法实现2。。。");
}
}
调用类
public class Client {
public static void main(String[] args) {
Strategy strategy = new ConcreteStrategy1();
Context context = new Context(strategy);
context.doAnything();
}
}
输出结果
策略算法实现1。。。
实例我暂时没有想到太好的,所以套用一下书中的例子。
- 策略模式实例代码
抽象策略
public interface Strategy {
void operate();
}
锦囊
public class Context {
private Strategy strategy;
// 构造函数,要你使用哪个妙计
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void operate() {
this.strategy.operate();
}
}
具体策略类
public class GivenGreenLight implements Strategy {
@Override
public void operate() {
System.out.println("求吴国太开个绿灯,放行");
}
}
public class BlackEnemy implements Strategy {
@Override
public void operate() {
System.out.println("孙夫人断后,挡住追兵");
}
}
public class BackDoor implements Strategy {
@Override
public void operate() {
System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备");
}
}
调用类(周瑜)
public class Zhaoyun {
public static void main(String[] args) {
Context context;
System.out.println("----------刚到吴国使用第一个锦囊---------------");
context = new Context(new BackDoor());
context.operate();
System.out.println("\n");
System.out.println("----------刘备乐不思蜀使用第二个锦囊---------------");
context.setStrategy(new GivenGreenLight());
context.operate();
System.out.println("\n");
System.out.println("----------孙权的追兵来了,使用第三个锦囊---------------");
context.setStrategy(new BlackEnemy());
context.operate();
System.out.println("\n");
}
}
输出结果
----------刚到吴国使用第一个锦囊---------------
找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备
----------刘备乐不思蜀使用第二个锦囊---------------
求吴国太开个绿灯,放行
----------孙权的追兵来了,使用第三个锦囊---------------
孙夫人断后,挡住追兵
- 策略模式的优缺点
- 策略类之间可以自由切换,由于策略类实现自同一个抽象,所以他们之间可以自由切换。
- 可扩展性强,增加一个新的策略对策略模式来说非常容易。
- 策略类过多的时候不易维护。
- 策略模式使用场景
- 当几个类的具体逻辑(算法)相同的时候,只在小部分地方有区别可以考虑策略模式。
- 有几种相似的行为(算法),客户端需要动态地决定使用哪一种,那么可以使用策略模式。
参考书籍:设计模式之禅
实例代码放在这里。
本文深入解析策略模式,一种常用的设计模式,通过定义一组算法并封装它们,使得算法可以在运行时自由切换。文章通过代码示例详细介绍了策略模式的三个关键角色:Context、Strategy和ConcreteStrategy,展示了如何在不同策略间进行灵活选择。
1827





