策略模式

定义

定义一系列算法,将每个算法封装到具有公共接口的一系列策略类中,从而使它们可以相互替换,并让算法可以在不影响到客户端的情况下发生变化。

主要解决

在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

何时使用

一个系统有许多许多类,而区分它们的只是他们直接的行为。

如何解决

将这些算法封装成一个一个的类,任意地替换。

关键代码

实现同一个接口。

优点
  1. 算法可以自由切换;
  2. 避免使用多重条件判断;
  3. 扩展性良好。
缺点
  1. 策略类会增多;
  2. 所有策略类都需要对外暴露。
应用实例

刘备到江东取老婆,临行前,诸葛亮给了刘备三个锦囊妙计。刘备一个个拆开妙计,让孙权赔了夫人又折兵。
而妙计就是这里的策略。刘备就是一个执行者,从锦囊中取出妙计。

类图
策略模式_第1张图片
策略模式
代码实现

一、创建一个接口: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" ); 
    }
}

你可能感兴趣的:(策略模式)