其他分享
首页 > 其他分享> > 「补课」进行时:设计模式(11)——游戏中的策略模式

「补课」进行时:设计模式(11)——游戏中的策略模式

作者:互联网

1. 前文汇总

「补课」进行时:设计模式系列

2. 游戏中的策略模式

我是一个很喜欢玩游戏的人,周末在家打打游戏是真的很开心。

回想起来当年上大学的往昔峥嵘岁月,那时候基本上是一个人在玩游戏,背后围着好几个人看,一个个的充当着狗头军师的作用。

时间长了就能发现,喜欢看别人打游戏的人,往往自己玩的都不怎么样,但是当起狗头军师来那是一套一套的,难道这就是旁观者清?

当年在大学宿舍玩的最多还是「英雄联盟」,当年还是 AP 剑圣横行天下,然而每次排位遇到的都是别人家的剑圣和我方剑圣。

这时候,一般就是狗头军师上线的时候,你出这个 xxx ,保证你如何如何牛皮,哎呀,你先打谁谁谁啊,为啥老要追着一个肉砍。

如果把上面这个场景转化成写程序,基本上是这样的:

首先定义一个 LOL 的接口:

public interface LOL {
    void playMethod();
}

然后再来两个狗头军师实现这个接口,每个狗头军师都有自己的玩法:

public class DogStrategistA implements LOL{
    @Override
    public void playMethod() {
        System.out.println("先出攻击装,刚正面,不怂");
    }
}

public class DogStrategistB implements LOL {
    @Override
    public void playMethod() {
        System.out.println("先出防御装,站得住才有输出");
    }
}

接着,我们开启一局游戏:

public class LOLGame {
    private LOL lol;
    public LOLGame(LOL lol) {
        this.lol = lol;
    }
    public void play() {
        this.lol.playMethod();
    }
}

然后下面是一个测试类:

public class Test {
    public static void main(String[] args) {
        LOLGame game;
        System.out.println("狗头军师A的点子--------------");
        game = new LOLGame(new DogStrategistA());
        game.play();
        System.out.println("狗头军师B的点子--------------");
        game = new LOLGame(new DogStrategistB());
        game.play();
    }
}

最后的执行结果如下:

狗头军师A的点子--------------
先出攻击装,刚正面,不怂
狗头军师B的点子--------------
先出防御装,站得住才有输出

是不是感觉上面这串代码好像和平时写的没啥区别,然而你并没有猜错,这就是策略模式。

3. 策略模式

3.1 定义

策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern)。其定义如下:

Define a family of algorithms,encapsulate each one,and make theminterchangeable.(定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。)

通用代码如下:

public interface Strategy {
    void doSomethinging();
}

public class ConcreteStrategy1 implements Strategy {
    @Override
    public void doSomethinging() {
        System.out.println("具体策略1");
    }
}

public class ConcreteStrategy2 implements Strategy {
    @Override
    public void doSomethinging() {
        System.out.println("具体策略2");
    }
}

public class Context {
    private Strategy strategy;
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    public void doAnything() {
        this.strategy.doSomethinging();
    }
}

public class Test {
    public static void main(String[] args) {
        Strategy strategy = new ConcreteStrategy1();
        Context context = new Context(strategy);
        context.doAnything();
    }
}

3.2 优点

3.3 缺点

如果系统中的一个策略家族的具体策略数量超过 4 个,则需要考虑使用混合模式,解决策略类膨胀和对外暴露的问题。

标签:11,策略,void,模式,Strategy,补课,狗头军师,设计模式,public
来源: https://www.cnblogs.com/babycomeon/p/13992552.html