暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

JAVA设计模式之策略模式(二)

小宇想买乌龟 2018-09-28
227

说起目前比较火爆的游戏,就要说到刺激战场了,这款游戏自从上线之后就深受玩家们的喜爱,并且热度也一直都在上升当中,丝毫未减,包括我自己也深深着迷。我们都知道,在刺激战场中最重要的物资资源想必就是枪械武器了。特别是AWM,一枪爆掉三级头,简直就是信仰之枪啊。反正我是从来没捡到过。。。


昨天晚上在游戏的时候,我苟在草丛中大气不敢出,无聊时,只能换换枪玩,手枪->M416->AK47->手枪…,换着换着,莫名有一种熟悉感。换枪的这个动作,不就是JAVA中的策略模式么?(这就是我,无时无刻都在学习)。

今天我们就来聊聊java中的策略模式。官方介绍如下:

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

使用场景:

1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。

2、一个系统需要动态地在几种算法中选择一种。

3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。

觉得拗口,难以理解?还是拿最初的吃鸡游戏来说吧。我们都知道,每个人最多只能拿三把枪,一把手枪,两把大枪。落地之后先是捡到一把手枪,看到大枪之后再去捡大枪,大枪总共有两把,近战的时候我们都会选择AK,M416之类的。当敌人很远的时候,就要换狙击枪了。这里执行这就是我们,策略就是枪,我们会根据不同的场景使用不同的枪(策略)。总结下来场景就是这样的

我身上有三把枪(左轮手枪,M416,AWM)

落地:使用左轮手枪杀人

对方人很多:切换M416(策略),突突突。干掉一队人

800里开外有个敌人:切换AWM(策略),算好距离。嘭~,,一枪干掉

场景有了,接下来我们来用代码来设计

先写一个武器接口Weapon

package strategy;

public interface Weapon {
    public void shooting();
}

然后是左轮手枪,M416,AWM这三把枪都实现了武器Weapon接口

左轮手枪:

package strategy;

public class Revolver implements Weapon{

    @Override
    public void shooting() {
        System.out.println("左轮手枪杀人~");
    }

}

M416:

package strategy;

public class M416 implements Weapon{

    @Override
    public void shooting() {
        System.out.println("M416突突突射人~");
    }

}

AWM:

package strategy;

public class AWM implements Weapon{

    @Override
    public void shooting() {
        System.out.println("AWM爆头击杀~");
    }
}

好了,现在武器都有了,我们还缺个人。拥有射击动作

package strategy;

public class Person {
    private Weapon weapon;

    public void setWeapon(Weapon w) {
        this.weapon = w;
    }
    public void shooting() {
        if(null != weapon)  
            weapon.shooting();
    }
}

注意,这个类里面也有一个shooting方法,这个和武器接口的方法是没有任何关联的。

好了,现在什么都有了,我们就开始进行game吧

package strategy;

public class StartClient {

    public static void main(String[] args) {
        Person p = new Person();
        p.setWeapon(new Revolver());//使用左轮手枪
        p.shooting();
        p.setWeapon(new M416());//使用M416
        p.shooting();
        p.setWeapon(new AWM());//使用AWM
        p.shooting();
    }
}

完成后运行:


完了之后再来总结一下(策略模式):

重点在于:给对象传入什么样的策略,就执行什么样的动作。
优点在于:可以轻易的扩展与改变策略,可以动态改变对象的行为。
缺点在于:客户端必须知道所有的策略类,并自行决定使用哪一种。每个具体的策略都会产生一个新类,这样会造成很多策略类。


文章转载自小宇想买乌龟,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论