设计模式-策略模式

策略模式中一个类的行为可以在运行的时候进行更改,我们需要定义一个策略的接口,让所有的具体策略实现这个接口,然后封装一个可以执行策略的对象,可以通过传入不同的策略,执行不同的算法;

  1. 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
  2. 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
  3. 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
  4. 如何解决:将这些算法封装成一个一个的类,任意地替换。
  5. 关键代码:实现同一个接口。

这里举例借鉴了《您的设计模式》中诸葛亮给赵云的锦囊妙计,让赵云去东吴的过程中拆开;

下面看一下类图:

 

 

实现策略模式的有以下几个步骤:

    • 定义一个策略接口
    • 让能够执行的具体策略实现这个接口
    • 封装一个可以执行策略的对象
    • 调用对应的策略

1、定义一个策略接口

package com.dongl.strategy;

/**
 * 定义一个的策略
 */
public interface Strategy {

    //每个锦囊妙计都是一个可执行的算法
    public void operate();
}

 

2、具体策略实现策略接口

第一个策略:

package com.dongl.strategy;

public class BackDoor implements Strategy{
    @Override
    public void operate() {
        System.out.println("找乔国老帮忙,让吴国太给孙权施加压力");
    }
}

第二个策略:

package com.dongl.strategy;

public class BlockEnemy implements Strategy {
    @Override
    public void operate() {
        System.out.println("孙夫人断后,挡住追兵");
    }
}

第三个策略:

package com.dongl.strategy;

public class GivenGreenLight implements Strategy {
    @Override
    public void operate() {
        System.out.println("求吴国太开个绿灯,放行!");
    }
}

 

3、封装一个可以执行策略的

package com.dongl.strategy;

/**
 * 计谋有了,那还要有锦囊
 */
public class Context {
    //构造函数,你要使用那个妙计
    private Strategy straegy;
    public Context(Strategy strategy){
        this.straegy = strategy;
    }
    //使用计谋了,看我出招了
    public void operate(){
        this.straegy.operate();
    }
}

 

4、调用对应策略

package com.dongl.strategy;

public class ZhaoYun {
    /**
     * 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计
     */
    public static void main(String[] args) {
        Context context;

        System.out.println("-----------刚刚到吴国的时候拆第一个-------------");
        context = new Context(new BackDoor()); //拿到妙计
        context.operate(); //拆开执行

        System.out.println("-----------刘备乐不思蜀了,拆第二个了-------------");
        context = new Context(new GivenGreenLight());
        context.operate(); //执行了第二个锦囊了

        System.out.println("-----------孙权的小兵追了,咋办?拆第三个 -------------");
        context = new Context(new BlockEnemy());
        context.operate(); //孙夫人退兵
    }
}

 

posted @ 2020-07-15 17:35  AmourLee  阅读(152)  评论(0)    收藏  举报