定义
定义一系列算法,将每个算法封装到具有公共接口的一系列策略类中,从而使它们可以相互替换,并让算法可以在不影响到客户端的情况下发生变化。
主要解决
在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
何时使用
一个系统有许多许多类,而区分它们的只是他们直接的行为。
如何解决
将这些算法封装成一个一个的类,任意地替换。
关键代码
实现同一个接口。
优点
- 算法可以自由切换;
- 避免使用多重条件判断;
- 扩展性良好。
缺点
- 策略类会增多;
- 所有策略类都需要对外暴露。
应用实例
刘备到江东取老婆,临行前,诸葛亮给了刘备三个锦囊妙计。刘备一个个拆开妙计,让孙权赔了夫人又折兵。
而妙计就是这里的策略。刘备就是一个执行者,从锦囊中取出妙计。
类图
代码实现
一、创建一个接口:IStrategy.java
public interface IStrategy {
public void operate() ;
}
二、创建实现接口的实体类,即对应锦囊里面的策略
策略一:找乔国老帮忙,走后门
BackDoor.java
public class BackDoor implements IStrategy {
@Override
public void operate() {
System.out.print( "找乔国老帮忙,走后门" );
}
}
策略二:找吴老太帮忙,开绿灯
GreenLight.java
public class GreenLight implements IStrategy{
@Override
public void operate() {
System.out.print( "找吴老太帮忙,开绿灯" );
}
}
策略三:让老婆香香断后
BlockEnemy.java
public class BlockEnemy implements IStrategy {
@Override
public void operate() {
System.out.print( "让老婆香香断后" );
}
}
三、创建 Context 类
Context类相当于存放妙计的精囊
Context.java
public class Context {
private IStrategy strategy;
public Context (IStrategy strategy) {
this.strategy = strategy;
}
public void oprater() {
this.strategy.operate();
}
}
四、使用 Context 来查看当它改变策略时的行为变化
相当于刘备拆开妙计执行
public class StrategyPatternDemo {
private static Context context;
public static void main (String[] args) {
context = new Context(new BackDoor());
context.oprater();
System.out.print( "\n" );
context = new Context( new GreenLight() );
context.oprater();
System.out.print( "\n" );
context = new Context( new BlockEnemy() );
context.oprater();
System.out.print( "\n" );
}
}