前言

本文转载自威威喵,分享了常见的策略模式,非常生动,相信对大家有所帮助。

威威喵的博客地址

https://blog.csdn.net/smile_Running/article/details/81505627

晚上的时候,抽了点时间看了一下设计模式相关书籍,毕竟有些东西还是得重温一下的,脑子不灵光,记住不啊。看着看着就看到了策略设计模式,关于这个策略模式,它书本上是这样定义的:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。


关于策略模式,这本书上是用了一个理财利率计算的例子,那么理财的软件有非常多,像余额宝这样的,把钱存进去就可以得到一点收入,也是非常不错的。而理财软件并非只有这个,不同的人可能用的软件都不一样,所有这里肯定就有利率计算的区别了。我可能把钱分别投入到不同的理财软件,那么每日收入当然就是不同的了,所有这里就用了不同的收益算法。

那么这里的收益算法必定和软件息息相关,不同的软件收益不同,那我们向不同软件投资就是不同的策略,可能看哪个比较高,就往那个软件里面存一点钱,就用到了策略设计模式。

不过呢,我在看策略设计模式时,忽然想到了三国中的诸葛亮,说到策略,我印象里记忆最深刻的还是诸葛亮了,在三国时期,那策略可真是无以匹敌啊。这样一关联起来,我就马上想写一个诸葛亮排兵布阵的策略模式。

接下来,我要介绍一下代码的意思,故事发生在三国时期,忽然刘备的驻军遭到了敌人的袭击,而五虎上将分别从其他不同的地方赶过来支援,由于派兵需要比对两军之间的战斗力及战耗情况,所以诸葛亮要用最大的利益来换取胜利与战绩。

诸葛亮手下有五虎上将:张飞,关羽,赵云,马超,黄忠。但只能派出一位作战,而且五虎上将的实力各不相同,且拥有的战力和士兵人数也不同。我们来看一下具体情况:

我军大将:

  • 张飞:拥兵 9500 人,战斗力 2.35

  • 关羽:拥兵 9000 人,战斗力 2.45

  • 赵云:拥兵 8500 人,战斗力 2.55

  • 马超:拥兵 10000 人,战斗力 2.30

  • 黄忠:拥兵 11000 人,战斗力 2.20

敌军大将:

  • 曹操:拥兵 18000 人,战斗力 1.20

好了,拟定的战力表已经确定,那么这场战争的胜利和战绩都掌握在诸葛亮手中,诸葛亮利用了一些简单的计算,根据双方的拥兵数量和战力进行了比较,最后得出应该派遣哪一位五虎上将去支援才能获得最好的战绩,还有要考虑战损情况。

接着直接上代码,一个是 诸葛亮 类:

  1package com.xww.dp.strategy;23/**4 * 诸葛亮,军师策略,发兵操作。5 * 6 * @author xww7 * 8 * @博客 :https://blog.csdn.net/smile_running?t=19 *10 */11public class Zhugeliang {12    private int enemy;// 敌军人数13    private float enemyfighting;// 战斗力1415    // 五虎将16    public enum Wuhu {17        zhangfei, guanyu, zhaoyun, machao, huangzhong18    }1920    public Zhugeliang(int enemy, float fighting) {21        this.enemy = enemy;22        this.enemyfighting = fighting;23    }2425    // 派遣军队26    public String dispatchTroops(Wuhu wuhu) {27        switch (wuhu) {28        case zhangfei:29            return zhangfeiArmy();30        case guanyu:31            return guanyuArmy();32        case zhaoyun:33            return zhaoyunArmy();34        case machao:35            return machaoArmy();36        case huangzhong:37            return huangzhongArmy();38        }39        return "";40    }4142    // 张飞的军队43    private String zhangfeiArmy() {44        int army = 9500;45        float fighting = 2.35f;4647        // 敌人实力48        int enemyStrength = (int) (enemy * enemyfighting);49        // 我军实力50        int zhangfeiStrength = (int) (army * fighting);51        // 战斗结果52        int soldier = zhangfeiStrength - enemyStrength;5354        return soldier > 0 ? "战胜!剩余士兵:" + soldier : "战败!";55    }5657    // 关羽的军队58    private String guanyuArmy() {59        int army = 9000;60        float fighting = 2.45f;6162        // 敌人实力63        int enemyStrength = (int) (enemy * enemyfighting);64        // 我军实力65        int zhangfeiStrength = (int) (army * fighting);66        // 战斗结果67        int soldier = zhangfeiStrength - enemyStrength;6869        return soldier > 0 ? "战胜!剩余士兵:" + soldier : "战败!";70    }7172    // 赵云的军队73    private String zhaoyunArmy() {74        int army = 8500;75        float fighting = 2.55f;7677        // 敌人实力78        int enemyStrength = (int) (enemy * enemyfighting);79        // 我军实力80        int zhangfeiStrength = (int) (army * fighting);81        // 战斗结果82        int soldier = zhangfeiStrength - enemyStrength;8384        return soldier > 0 ? "战胜!剩余士兵:" + soldier : "战败!";85    }8687    // 马超的军队88    private String machaoArmy() {89        int army = 10000;90        float fighting = 2.3f;9192        // 敌人实力93        int enemyStrength = (int) (enemy * enemyfighting);94        // 我军实力95        int zhangfeiStrength = (int) (army * fighting);96        // 战斗结果97        int soldier = zhangfeiStrength - enemyStrength;9899        return soldier > 0 ? "战胜!剩余士兵:" + soldier : "战败!";
100    }
101
102    // 黄忠的军队
103    private String huangzhongArmy() {
104        int army = 11000;
105        float fighting = 2.2f;
106
107        // 敌人实力
108        int enemyStrength = (int) (enemy * enemyfighting);
109        // 我军实力
110        int zhangfeiStrength = (int) (army * fighting);
111        // 战斗结果
112        int soldier = zhangfeiStrength - enemyStrength;
113
114        return soldier > 0 ? "战胜!剩余士兵:" + soldier : "战败!";
115    }
116
117}

这个类就是诸葛亮通过对比两军战力的相关算法,对比了五位将军的战力和兵力,通过简单的计算来模拟一下,然后另一个是主类:

 1package com.xww.dp.strategy;23import com.xww.dp.strategy.Zhugeliang.Wuhu;45public class StrategyPatternClient {67    public static void main(String[] args) {89        int enemy = getEnemy();
10        float fighting = getFighting();
11
12        Zhugeliang liang = new Zhugeliang(enemy, fighting);
13
14        String result = liang.dispatchTroops(Wuhu.zhangfei);
15
16        //张飞 725
17        //关羽 450
18        //赵云 75
19        //马超 1400
20        //黄忠 2600
21
22        System.out.println(result);
23    }
24
25    public static int getEnemy() {
26        int enemyCount = 18000;
27        System.out.println("获得敌情,敌人数量:" + enemyCount + "人");
28        return enemyCount;
29    }
30
31    public static float getFighting() {
32        float fighting = 1.2f;
33        System.out.println("敌人战力:" + fighting + "倍");
34        return fighting;
35    }
36
37}

根据简单的模拟战斗,可以得出双方交战的战绩情况。我们把五位上将的战绩列出来:









上面运行结果是每一位的战绩情况,根据没一位将军的拥兵数量和战斗力计算出来的。它们的剩余士兵就是战绩,接下来我们来计算一下他们的战斗损失情况。

战斗损失:

  • 张飞 :拥兵 9500,剩余 725,损失 8775 人

  • 关羽 :拥兵 9000,剩余 450,损失 8550 人

  • 赵云 :拥兵 8500,剩余 75,损失 8425 人

  • 马超 :拥兵 10000,剩余 1400,损失 8600 人

  • 黄忠:拥兵 11000,剩余 2600,损失 8400 人

计算一下战斗损失,还是诸葛亮老谋深算,乍一看 关羽、赵云 比较牛皮,这赵云差点就锤不过了,别看 马超老黄盖 出马,所谓老将出马,一个顶俩。

好了,这个例子就是这样的,也是我自己瞎想着玩的,感觉非常有意思,就用代码实现了一下。至此,我们还没有用上策略模式,虽然诸葛亮料事如神,

策略模式的运用

接下来,才是我们的策略模式具体使用情况,关于策略模式的定义,它是说把这一系列算法一个一个的封装起来,并且使其能够相互替换。这样的话,我们上面代码中的算法部分,就只有五虎上将和敌军的战力比较情况了,比如这一部分:

 1    // 赵云的军队2    private String zhaoyunArmy() {3        int army = 8500;4        float fighting = 2.55f;56        // 敌人实力7        int enemyStrength = (int) (enemy * enemyfighting);8        // 我军实力9        int zhangfeiStrength = (int) (army * fighting);
10        // 战斗结果
11        int soldier = zhangfeiStrength - enemyStrength;
12
13        return soldier > 0 ? "战胜!剩余士兵:" + soldier : "战败!";
14    }

根据策略模式的使用规则,要把算法封装为一个类,也就是把上部分代码封装到类里面去。有了这样的思想,我们事情就好办了,为五虎上将建立五个类,把算法搬到里面去,这是第一步要做的。

策略模式还指出需要根据算法替换不同的类,也就是诸葛亮可以派遣五虎上将中的任何一位都可以,所以这里需要一个接口,根据多态性,我们可以传入它的不同实现类。下面开始着手改为策略模式吧!

首先,新建一个接口,传入敌军的人数和战力值,返回的是战斗结果,如下:

 1package com.xww.dp.strategy;23/**4 * 诸葛亮策略接口5 * 6 * @author xww7 * @博客 https://blog.csdn.net/smile_running?t=18 */9public interface ZhugeliangStrategy {
10
11    // 派遣五虎上将
12    String wuhu(int enemy, float enemyFlighting);
13}

接下来是对每一个五虎上将的算法封装,代码如下:

 1package com.xww.dp.strategy;23/**4 * 五虎上将 - 张飞5 * 6 * @author xww7 *8 */9public class ZhangFei implements ZhugeliangStrategy {
10
11    public ZhangFei() {
12
13    }
14
15    @Override
16    public String wuhu(int enemy, float enemyFlighting) {
17        int army = 9500;
18        float fighting = 2.35f;
19
20        // 敌人实力
21        int enemyStrength = (int) (enemy * enemyFlighting);
22        // 我军实力
23        int zhangfeiStrength = (int) (army * fighting);
24        // 战斗结果
25        int soldier = zhangfeiStrength - enemyStrength;
26
27        return soldier > 0 ? "战胜!剩余士兵:" + soldier : "战败!";
28    }
29}

要实现刚刚创建的策略接口,把算法部分考过来就行了,剩余四个都是这样的操作,看看就懂了。关羽类的代码:

 1package com.xww.dp.strategy;23public class GuanYu implements ZhugeliangStrategy {45    public GuanYu() {67    }89    @Override
10    public String wuhu(int enemy, float enemyFlighting) {
11        int army = 8500;
12        float fighting = 2.55f;
13
14        // 敌人实力
15        int enemyStrength = (int) (enemy * enemyFlighting);
16        // 我军实力
17        int zhangfeiStrength = (int) (army * fighting);
18        // 战斗结果
19        int soldier = zhangfeiStrength - enemyStrength;
20
21        return soldier > 0 ? "战胜!剩余士兵:" + soldier : "战败!";
22    }
23
24}

剩下的赵云、马超、黄忠三个类就不贴代码了,几乎一摸一样。接着,诸葛亮类也需要做出相应的修改,我们之前的派遣军队是一个 enum

 1package com.xww.dp.strategy;23/**4 * 诸葛亮,军师策略,发兵操作。5 * 6 * @author xww7 * 8 * @博客 :https://blog.csdn.net/smile_running?t=19 *
10 */
11public class Zhugeliang {
12    private int enemy;// 敌军人数
13    private float enemyfighting;// 战斗力
14
15    public Zhugeliang(int enemy, float fighting) {
16        this.enemy = enemy;
17        this.enemyfighting = fighting;
18    }
19
20    // 派遣军队
21    public String dispatchTroops(ZhugeliangStrategy strategy) {
22        return strategy.wuhu(enemy, enemyfighting);
23    }
24
25}

对比一下,算法部分全部被移到了每一个类中,而且诸葛亮类也与几个五虎上将解耦了,他们通过一个接口联系。最后,我们的客户端就可以这样调用了:

 1package com.xww.dp.strategy;23public class StrategyPatternClient {45    public static void main(String[] args) {67        int enemy = getEnemy();8        float fighting = getFighting();9
10        Zhugeliang liang = new Zhugeliang(enemy, fighting);
11
12        // 这里直接 new 策略的实现类
13        String result = liang.dispatchTroops(new HuangZhong());
14
15        System.out.println(result);
16    }
17
18    public static int getEnemy() {
19        int enemyCount = 18000;
20        System.out.println("获得敌情,敌人数量:" + enemyCount + "人");
21        return enemyCount;
22    }
23
24    public static float getFighting() {
25        float fighting = 1.2f;
26        System.out.println("敌人战力:" + fighting + "倍");
27        return fighting;
28    }
29
30}

好了,这就是策略模式的基本代码了,把每个算法封装为类,提供一个算法的接口,通过实现该接口实现不同的算法,然后调用时,只要有 new

晚上的时候,抽了点时间看了一下设计模式相关书籍,毕竟有些东西还是得重温一下的,脑子不灵光,记住不啊。看着看着就看到了策略设计模式,关于这个策略模式,它书本上是这样定义的:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。


关于策略模式,这本书上是用了一个理财利率计算的例子,那么理财的软件有非常多,像余额宝这样的,把钱存进去就可以得到一点收入,也是非常不错的。而理财软件并非只有这个,不同的人可能用的软件都不一样,所有这里肯定就有利率计算的区别了。我可能把钱分别投入到不同的理财软件,那么每日收入当然就是不同的了,所有这里就用了不同的收益算法。

那么这里的收益算法必定和软件息息相关,不同的软件收益不同,那我们向不同软件投资就是不同的策略,可能看哪个比较高,就往那个软件里面存一点钱,就用到了策略设计模式。

不过呢,我在看策略设计模式时,忽然想到了三国中的诸葛亮,说到策略,我印象里记忆最深刻的还是诸葛亮了,在三国时期,那策略可真是无以匹敌啊。这样一关联起来,我就马上想写一个诸葛亮排兵布阵的策略模式。

接下来,我要介绍一下代码的意思,故事发生在三国时期,忽然刘备的驻军遭到了敌人的袭击,而五虎上将分别从其他不同的地方赶过来支援,由于派兵需要比对两军之间的战斗力及战耗情况,所以诸葛亮要用最大的利益来换取胜利与战绩。

诸葛亮手下有五虎上将:张飞,关羽,赵云,马超,黄忠。但只能派出一位作战,而且五虎上将的实力各不相同,且拥有的战力和士兵人数也不同。我们来看一下具体情况:

我军大将:

  • 张飞:拥兵 9500 人,战斗力 2.35

  • 关羽:拥兵 9000 人,战斗力 2.45

  • 赵云:拥兵 8500 人,战斗力 2.55

  • 马超:拥兵 10000 人,战斗力 2.30

  • 黄忠:拥兵 11000 人,战斗力 2.20

敌军大将:

  • 曹操:拥兵 18000 人,战斗力 1.20

好了,拟定的战力表已经确定,那么这场战争的胜利和战绩都掌握在诸葛亮手中,诸葛亮利用了一些简单的计算,根据双方的拥兵数量和战力进行了比较,最后得出应该派遣哪一位五虎上将去支援才能获得最好的战绩,还有要考虑战损情况。

接着直接上代码,一个是 诸葛亮 类:

  1package com.xww.dp.strategy;23/**4 * 诸葛亮,军师策略,发兵操作。5 * 6 * @author xww7 * 8 * @博客 :https://blog.csdn.net/smile_running?t=19 *10 */11public class Zhugeliang {12    private int enemy;// 敌军人数13    private float enemyfighting;// 战斗力1415    // 五虎将16    public enum Wuhu {17        zhangfei, guanyu, zhaoyun, machao, huangzhong18    }1920    public Zhugeliang(int enemy, float fighting) {21        this.enemy = enemy;22        this.enemyfighting = fighting;23    }2425    // 派遣军队26    public String dispatchTroops(Wuhu wuhu) {27        switch (wuhu) {28        case zhangfei:29            return zhangfeiArmy();30        case guanyu:31            return guanyuArmy();32        case zhaoyun:33            return zhaoyunArmy();34        case machao:35            return machaoArmy();36        case huangzhong:37            return huangzhongArmy();38        }39        return "";40    }4142    // 张飞的军队43    private String zhangfeiArmy() {44        int army = 9500;45        float fighting = 2.35f;4647        // 敌人实力48        int enemyStrength = (int) (enemy * enemyfighting);49        // 我军实力50        int zhangfeiStrength = (int) (army * fighting);51        // 战斗结果52        int soldier = zhangfeiStrength - enemyStrength;5354        return soldier > 0 ? "战胜!剩余士兵:" + soldier : "战败!";55    }5657    // 关羽的军队58    private String guanyuArmy() {59        int army = 9000;60        float fighting = 2.45f;6162        // 敌人实力63        int enemyStrength = (int) (enemy * enemyfighting);64        // 我军实力65        int zhangfeiStrength = (int) (army * fighting);66        // 战斗结果67        int soldier = zhangfeiStrength - enemyStrength;6869        return soldier > 0 ? "战胜!剩余士兵:" + soldier : "战败!";70    }7172    // 赵云的军队73    private String zhaoyunArmy() {74        int army = 8500;75        float fighting = 2.55f;7677        // 敌人实力78        int enemyStrength = (int) (enemy * enemyfighting);79        // 我军实力80        int zhangfeiStrength = (int) (army * fighting);81        // 战斗结果82        int soldier = zhangfeiStrength - enemyStrength;8384        return soldier > 0 ? "战胜!剩余士兵:" + soldier : "战败!";85    }8687    // 马超的军队88    private String machaoArmy() {89        int army = 10000;90        float fighting = 2.3f;9192        // 敌人实力93        int enemyStrength = (int) (enemy * enemyfighting);94        // 我军实力95        int zhangfeiStrength = (int) (army * fighting);96        // 战斗结果97        int soldier = zhangfeiStrength - enemyStrength;9899        return soldier > 0 ? "战胜!剩余士兵:" + soldier : "战败!";
100    }
101
102    // 黄忠的军队
103    private String huangzhongArmy() {
104        int army = 11000;
105        float fighting = 2.2f;
106
107        // 敌人实力
108        int enemyStrength = (int) (enemy * enemyfighting);
109        // 我军实力
110        int zhangfeiStrength = (int) (army * fighting);
111        // 战斗结果
112        int soldier = zhangfeiStrength - enemyStrength;
113
114        return soldier > 0 ? "战胜!剩余士兵:" + soldier : "战败!";
115    }
116
117}

这个类就是诸葛亮通过对比两军战力的相关算法,对比了五位将军的战力和兵力,通过简单的计算来模拟一下,然后另一个是主类:

 1package com.xww.dp.strategy;23import com.xww.dp.strategy.Zhugeliang.Wuhu;45public class StrategyPatternClient {67    public static void main(String[] args) {89        int enemy = getEnemy();
10        float fighting = getFighting();
11
12        Zhugeliang liang = new Zhugeliang(enemy, fighting);
13
14        String result = liang.dispatchTroops(Wuhu.zhangfei);
15
16        //张飞 725
17        //关羽 450
18        //赵云 75
19        //马超 1400
20        //黄忠 2600
21
22        System.out.println(result);
23    }
24
25    public static int getEnemy() {
26        int enemyCount = 18000;
27        System.out.println("获得敌情,敌人数量:" + enemyCount + "人");
28        return enemyCount;
29    }
30
31    public static float getFighting() {
32        float fighting = 1.2f;
33        System.out.println("敌人战力:" + fighting + "倍");
34        return fighting;
35    }
36
37}

根据简单的模拟战斗,可以得出双方交战的战绩情况。我们把五位上将的战绩列出来:






上面运行结果是每一位的战绩情况,根据没一位将军的拥兵数量和战斗力计算出来的。它们的剩余士兵就是战绩,接下来我们来计算一下他们的战斗损失情况。

战斗损失:

  • 张飞 :拥兵 9500,剩余 725,损失 8775 人

  • 关羽 :拥兵 9000,剩余 450,损失 8550 人

  • 赵云 :拥兵 8500,剩余 75,损失 8425 人

  • 马超 :拥兵 10000,剩余 1400,损失 8600 人

  • 黄忠:拥兵 11000,剩余 2600,损失 8400 人

计算一下战斗损失,还是诸葛亮老谋深算,乍一看 关羽、赵云 比较牛皮,这赵云差点就锤不过了,别看 马超老黄盖 出马,所谓老将出马,一个顶俩。

好了,这个例子就是这样的,也是我自己瞎想着玩的,感觉非常有意思,就用代码实现了一下。至此,我们还没有用上策略模式,虽然诸葛亮料事如神,

策略模式的运用

接下来,才是我们的策略模式具体使用情况,关于策略模式的定义,它是说把这一系列算法一个一个的封装起来,并且使其能够相互替换。这样的话,我们上面代码中的算法部分,就只有五虎上将和敌军的战力比较情况了,比如这一部分:

 1    // 赵云的军队2    private String zhaoyunArmy() {3        int army = 8500;4        float fighting = 2.55f;56        // 敌人实力7        int enemyStrength = (int) (enemy * enemyfighting);8        // 我军实力9        int zhangfeiStrength = (int) (army * fighting);
10        // 战斗结果
11        int soldier = zhangfeiStrength - enemyStrength;
12
13        return soldier > 0 ? "战胜!剩余士兵:" + soldier : "战败!";
14    }

根据策略模式的使用规则,要把算法封装为一个类,也就是把上部分代码封装到类里面去。有了这样的思想,我们事情就好办了,为五虎上将建立五个类,把算法搬到里面去,这是第一步要做的。

策略模式还指出需要根据算法替换不同的类,也就是诸葛亮可以派遣五虎上将中的任何一位都可以,所以这里需要一个接口,根据多态性,我们可以传入它的不同实现类。下面开始着手改为策略模式吧!

首先,新建一个接口,传入敌军的人数和战力值,返回的是战斗结果,如下:

 1package com.xww.dp.strategy;23/**4 * 诸葛亮策略接口5 * 6 * @author xww7 * @博客 https://blog.csdn.net/smile_running?t=18 */9public interface ZhugeliangStrategy {
10
11    // 派遣五虎上将
12    String wuhu(int enemy, float enemyFlighting);
13}

接下来是对每一个五虎上将的算法封装,代码如下:

 1package com.xww.dp.strategy;23/**4 * 五虎上将 - 张飞5 * 6 * @author xww7 *8 */9public class ZhangFei implements ZhugeliangStrategy {
10
11    public ZhangFei() {
12
13    }
14
15    @Override
16    public String wuhu(int enemy, float enemyFlighting) {
17        int army = 9500;
18        float fighting = 2.35f;
19
20        // 敌人实力
21        int enemyStrength = (int) (enemy * enemyFlighting);
22        // 我军实力
23        int zhangfeiStrength = (int) (army * fighting);
24        // 战斗结果
25        int soldier = zhangfeiStrength - enemyStrength;
26
27        return soldier > 0 ? "战胜!剩余士兵:" + soldier : "战败!";
28    }
29}

要实现刚刚创建的策略接口,把算法部分考过来就行了,剩余四个都是这样的操作,看看就懂了。关羽类的代码:

 1package com.xww.dp.strategy;23public class GuanYu implements ZhugeliangStrategy {45    public GuanYu() {67    }89    @Override
10    public String wuhu(int enemy, float enemyFlighting) {
11        int army = 8500;
12        float fighting = 2.55f;
13
14        // 敌人实力
15        int enemyStrength = (int) (enemy * enemyFlighting);
16        // 我军实力
17        int zhangfeiStrength = (int) (army * fighting);
18        // 战斗结果
19        int soldier = zhangfeiStrength - enemyStrength;
20
21        return soldier > 0 ? "战胜!剩余士兵:" + soldier : "战败!";
22    }
23
24}

剩下的赵云、马超、黄忠三个类就不贴代码了,几乎一摸一样。接着,诸葛亮类也需要做出相应的修改,我们之前的派遣军队是一个 enum

 1package com.xww.dp.strategy;23/**4 * 诸葛亮,军师策略,发兵操作。5 * 6 * @author xww7 * 8 * @博客 :https://blog.csdn.net/smile_running?t=19 *
10 */
11public class Zhugeliang {
12    private int enemy;// 敌军人数
13    private float enemyfighting;// 战斗力
14
15    public Zhugeliang(int enemy, float fighting) {
16        this.enemy = enemy;
17        this.enemyfighting = fighting;
18    }
19
20    // 派遣军队
21    public String dispatchTroops(ZhugeliangStrategy strategy) {
22        return strategy.wuhu(enemy, enemyfighting);
23    }
24
25}

对比一下,算法部分全部被移到了每一个类中,而且诸葛亮类也与几个五虎上将解耦了,他们通过一个接口联系。最后,我们的客户端就可以这样调用了:

 1package com.xww.dp.strategy;23public class StrategyPatternClient {45    public static void main(String[] args) {67        int enemy = getEnemy();8        float fighting = getFighting();9
10        Zhugeliang liang = new Zhugeliang(enemy, fighting);
11
12        // 这里直接 new 策略的实现类
13        String result = liang.dispatchTroops(new HuangZhong());
14
15        System.out.println(result);
16    }
17
18    public static int getEnemy() {
19        int enemyCount = 18000;
20        System.out.println("获得敌情,敌人数量:" + enemyCount + "人");
21        return enemyCount;
22    }
23
24    public static float getFighting() {
25        float fighting = 1.2f;
26        System.out.println("敌人战力:" + fighting + "倍");
27        return fighting;
28    }
29
30}

好了,这就是策略模式的基本代码了,把每个算法封装为类,提供一个算法的接口,通过实现该接口实现不同的算法,然后调用时,只要有 new

推荐阅读

Android 面试必备 - 知识图谱

致刚入职场的你 - 程序员的成长笔记

干起来,你就超过了 50% 的人

一个程序员的五年总结,给你不一样的角度

Fragment全解析系列(一):那些年踩过的坑

Fragment全解析系列(二):正确的使用姿势

带你全面了解 Android 内存优化

Android自定义控件进阶篇,自定义LayoutManager

stormjun94

扫一扫,欢迎关注我的公众号 stormjun94。如果你有好的文章,也欢迎你的投稿。

策略模式 — 孔明排兵布阵相关推荐

  1. 「BJOI 2019」排兵布阵

    传送门 problem 小 C 正在玩一款排兵布阵的游戏.在游戏中有 nnn 座城堡,每局对战由两名玩家来争夺这些城堡.每名玩家有 mmm 名士兵,可以向第 iii 座城堡派遣 aia_iai​ 名士 ...

  2. ASDFZ 3633 -- 排兵布阵

    Description 小 X 是生活在 9102 年的一位高二的 OIer,也是本套模拟题的主角. 这是一件往事了-- 小 X 正在玩一款排兵布阵的游戏,这时候小 R 突然来找小 X 出去陪她玩. ...

  3. [BJOI2019] 排兵布阵(分组背包)

    [BJOI2019] 排兵布阵 题目描述 小 C 正在玩一款排兵布阵的游戏.在游戏中有 nnn 座城堡,每局对战由两名玩家来争夺这些城堡.每名玩家有 mmm 名士兵,可以向第 iii 座城堡派遣 ai ...

  4. 洛谷P5322 [BJOI2019]排兵布阵【分组背包】

    题目描述 小 C 正在玩一款排兵布阵的游戏.在游戏中有 n 座城堡,每局对战由两名玩家来争夺这些城堡.每名玩家有 m 名士兵,可以向第 i 座城堡派遣 a_i名士兵去争夺这个城堡,使得总士兵数不超过 ...

  5. 洛谷 P5322 [BJOI2019]排兵布阵

    P5322 [BJOI2019]排兵布阵 题目大意:玩游戏~~,对于 n 个城堡,有 m 个士兵可以分别派遣到这些城堡. 同时我们有 s 个对手,在每个城堡都会与每个玩家单独比拼,在第 i 个城堡与每 ...

  6. P5322 [BJOI2019] 排兵布阵

    P5322 [BJOI2019] 排兵布阵 Summary: Description 小 C 正在排兵布阵.有 n n n 座城堡,每局对战由两名玩家来争夺这些城堡.每名玩家有 m m m 名士兵,可 ...

  7. 洛谷P5322 [BJOI2019] 排兵布阵 题解

    洛谷P5322 [BJOI2019] 排兵布阵 题解 题意:小 C 正在玩一款排兵布阵的游戏.在游戏中有 n n n 座城堡,每局对战由两名玩家来争夺这些城堡.每名玩家有 m m m 名士兵,可以向第 ...

  8. HDU 4539郑厂长系列故事――排兵布阵(状压DP)

    HDU 4539  郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 1 //#pragma ...

  9. hdu4539 郑厂长系列故事——排兵布阵 + POJ1158 炮兵阵地

    题意: 郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Other ...

最新文章

  1. mybatis注册了mapper但是还是报错_springboot整合Mybatis
  2. python cnn模型_ZfNet解卷积:可视化CNN模型( PythonCode可视化Cifar10)
  3. nginx生成ssl证书
  4. 现代php 阅读笔记,PHP 手册阅读笔记 - 语言参考篇
  5. python 数组维度_python – 非常基本的Numpy数组维度可视化
  6. 10g中如何修改数据库字符集-2
  7. redis学习-主从复制Master/slave
  8. python 放射 水平_基于Python的放射性核素大气扩散程序初步开发与验证
  9. 唐山师范学院计算机科学与技术地址,2021年唐山师范学院有几个校区,大一新生在哪个校区...
  10. ASP.NET Web API 入门 (API接口、寄宿方式、HttpClient调用)
  11. c#截取两个指定字符串中间的字符串
  12. android社交软件源码,Android 社交App+java web后台整套源代码
  13. 张宇:【线性代数】公式汇总!
  14. MPI 初认识 (入门教程)
  15. 2008年17款远程控制软件大比拼
  16. 简简的语法12——限定词到底是什么?在句子中起什么作用?
  17. Gamecenter 测试失败的解决方案
  18. Error “Client wants topic A to have B, but our version has C. Dropping connection.“
  19. MATLAB的使用(二) help命令全解
  20. OCL功率放大电路分析笔记

热门文章

  1. Scripted 0.4 released
  2. 【邮箱验证码】springboot 使用邮箱服务发送验证码 ,在阿里云服务器端口的配置
  3. 我的第一万天是多少?(日期计算器)
  4. 原型方法和对象的检测问题
  5. 【大众点评】—— 前端架构设计
  6. ES6的reduce用法
  7. 数据包括DEA预备知识
  8. 阿里云性能测试工具PTS介绍
  9. framework保持第三方app常驻
  10. matlab之Canny边缘检测