Java设计模式--策略模式

1 Strategy Pattern 策略模式

目的:一个类的行为或其算法可以在运行时更改;
实现:定义一系列的算法,实现同一个接口,把它们一个个封装起来, 使它们可相互替换。

1.适合一个系统需要动态地在几种算法中选择一种的场景;
2.在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护时使用;
3.一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。

2 实现

代码场景:三国演义中经典故事,赔了夫人又折兵的片段;
孙权采用周瑜计谋,骗刘备来东吴和亲,临行前,诸葛亮给赵云三个锦囊,内藏三条妙计,要他到南徐时打开第一个,到年底时打开第二个,危急无路时打开第三个;

1.锦囊具体策略角色
2.关键时刻环境角色

2.1 代码实现

抽象策略角色:锦囊SilkBag接口

public interface SilkBag {
    //解决问题
    void solveProblem();
}

具体策略类角色:南徐锦囊NanXuSilkBag类

public class NanXuSilkBag implements SilkBag {

    @Override
    public void solveProblem() {
        System.out.println("南徐锦囊打开:赵云打开第一个锦囊,即令士兵们去商店购买结婚用品,并大肆张扬:刘备要与孙权妹妹结亲了。并劝刘备去拜见乔国老");
    }

}

具体策略类角色:年底锦囊EndYearSilkBag类

public class EndYearSilkBag implements SilkBag{

    @Override
    public void solveProblem() {
        System.out.println("年底锦囊打开:赵云向刘备报告:曹操兴兵50 万报赤壁之仇,荆州危急,主公要赶快回去;刘备大惊,准备回荆州。");
    }

}

具体策略类角色:走投无路锦囊CorneredSilkBag类

public class CorneredSilkBag implements SilkBag{

    @Override
    public void solveProblem() {
        System.out.println("走投无路锦囊打开:刘备依计向夫人哭诉孙权、周瑜用美人计诱杀自己的阴谋,夫人大怒,命推出坐车,对东吴追赶的几个将军严辞斥骂,刘备得以逃脱。");
    }

}

环境类角色:场景或者说上下文 Situation类

/**
 * 上下文角色
 */
public class Situation {
    private String situationInfo;
    private SilkBag silkBag;
    public Situation(SilkBag silkBag, String situationInfo) {
        this.silkBag = silkBag;
        this.situationInfo = situationInfo;
    }
    public void solveProblem() {
        System.out.println("当时的情况是这样的:" + situationInfo);
        silkBag.solveProblem();
    }
}

2.2 涉及角色

在策略模式结构图中包含如下几个角色:

Context(环境类):环境类是使用算法的角色,它在解决某个问题(即实现某个方法)时可以采用多种策略。在环境类中维持一个对抽象策略类的引用实例,用于定义所采用的策略。

Strategy(抽象策略类):它为所支持的算法声明了抽象方法,是所有策略类的父类,它可以是抽象类或具体类,也可以是接口。环境类通过抽象策略类中声明的方法在运行时调用具体策略类中实现的算法。

ConcreteStrategy(具体策略类):它实现了在抽象策略类中声明的算法,在运行时,具体策略类将覆盖在环境类中定义的抽象策略类对象,使用一种具体的算法实现某个业务处理。

2.3 调用

调用者:

public class Client {
    public static void main(String[] args) {
        //剧情:刘备利用周瑜、曹仁厮杀,袭取了南郡、荆州、襄阳和长沙四郡;周瑜计上心来,孙权派人到荆州说亲。
        //剧情:刘备拒绝,诸葛亮笑道:您只管去东吴,我自有安排。
        //剧情:诸葛亮对赵云道:我这里有三个锦囊,内藏三条妙计。到南徐时打开第一个,到年底时打开第二个,危急无路时打开第三个。

        //锦囊妙计之南徐
        SilkBag nanXuSb = new NanXuSilkBag();
        //锦囊妙计之年底
        SilkBag endYearSb = new EndYearSilkBag();
        //锦囊妙计之走投无路
        SilkBag CorneredSb = new CorneredSilkBag();
        Situation situation= null;

        situation = new Situation(nanXuSb,"赵云领了500士兵护卫刘备前去东吴,到了南徐。");
        situation.solveProblem();

        System.out.println("剧情:周瑜安排的假戏变成了真事,心里叫苦不迭,一计不成,又心生一计:利用声色犬马迷住刘备,离间他们上下之间的关系,我们再出兵攻取荆州");

        situation = new Situation(endYearSb,"刘备迷恋新婚的甜蜜生活,暂时不想回荆州。赵云劝告也无用,非常焦急,转眼到了年底。");
        situation.solveProblem();

        System.out.println("剧情:孙权得知刘备逃跑,大怒,先后派两起人马追赶。");
        situation = new Situation(CorneredSb,"躲过两起人马追赶,刘备一行人快到柴桑地界,周瑜派出的一支军队拦住去路。见形势危急。");
        situation.solveProblem();
    }
}

结果:

当时的情况是这样的:赵云领了500士兵护卫刘备前去东吴,到了南徐。
南徐锦囊打开:赵云打开第一个锦囊,即令士兵们去商店购买结婚用品,并大肆张扬:刘备要与孙权妹妹结亲了。并劝刘备去拜见乔国老
剧情:周瑜安排的假戏变成了真事,心里叫苦不迭,一计不成,又心生一计:利用声色犬马迷住刘备,离间他们上下之间的关系,我们再出兵攻取荆州
当时的情况是这样的:刘备迷恋新婚的甜蜜生活,暂时不想回荆州。赵云劝告也无用,非常焦急,转眼到了年底。
年底锦囊打开:赵云向刘备报告:曹操兴兵50 万报赤壁之仇,荆州危急,主公要赶快回去;刘备大惊,准备回荆州。
剧情:孙权得知刘备逃跑,大怒,先后派两起人马追赶。
当时的情况是这样的:躲过两起人马追赶,刘备一行人快到柴桑地界,周瑜派出的一支军队拦住去路。见形势危急。
走投无路锦囊打开:刘备依计向夫人哭诉孙权、周瑜用美人计诱杀自己的阴谋,夫人大怒,命推出坐车,对东吴追赶的几个将军严辞斥骂,刘备得以逃脱。

Java设计模式汇总:点击跳转
代码地址:点击跳转

参考文献:
[ 1 ] 图解设计模式/(日)结城浩著;杨文轩译。–北京:人民邮电出版社,2017.1.
[ 2 ] 维基百科 设计模式
[ 3 ] 极客学院WIKI–设计模式.
[ 4 ] 菜鸟教程–设计模式.

猜你喜欢

转载自blog.csdn.net/weixx3/article/details/80288244