Java设计模式-装饰模式:《穿越火线》RMB 玩家的快乐~

栏目: Java · 发布时间: 7年前

内容简介:《穿越火线》这一游戏风靡一时,作为手游版的NC粉, 想当年也是雄姿英发啊。好汉不提当年勇,现在几乎不怎么玩了。。。别问我为什么,问就是没钱,哈哈哈哈嗝~现在的游戏,只要一充钱,各种属性增强,各种坑爹特权,实力再高也玩不赢RMB玩家啊,在小康路上已经迷了路的我,不禁得说上一句:实力不允许。装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

《穿越火线》这一游戏风靡一时,作为手游版的NC粉, 想当年也是雄姿英发啊。好汉不提当年勇,现在几乎不怎么玩了。。。别问我为什么,问就是没钱,哈哈哈哈嗝~

现在的游戏,只要一充钱,各种属性增强,各种坑爹特权,实力再高也玩不赢RMB玩家啊,在小康路上已经迷了路的我,不禁得说上一句:实力不允许。

Java设计模式-装饰模式:《穿越火线》RMB 玩家的快乐~

装饰模式的定义

装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。

对于网瘾少年来说,就是游戏里的皮肤,让游戏里的角色、武器啥的变得好看的。

装饰模式的通用类图:

Java设计模式-装饰模式:《穿越火线》RMB 玩家的快乐~
  • Component
    Component 是一个接口或者抽象类,它定义一个最核心的对象,是一个最原始的业务场景。
  • ConcreteComponent
    ConcreteComponent 是最核心、最原始的业务逻辑实现,要装饰的就是它。
  • Decorator
    顾名思义,它是一个专门做装饰的类,说白了,就是一个装修工。它一般是一个抽象类,也需要实现最原始的业务逻辑,不同于其它实现类的是,它需要定义一个 private  变量指向 Component 对象,一般通过构造的方式传入 Component 对象。
  • ConcreteComponentA、ConcreteComponentB
    它们是两个具体的装饰类,通过这两个装饰类来增强或减弱原始的业务逻辑,再说白了,就是游戏里的两个皮肤,给原先角色或武器装饰上后,别提多NB了。
Java设计模式-装饰模式:《穿越火线》RMB 玩家的快乐~

装饰模式的实现

首先定义一个具体的 业务 游戏场景,CF游戏中的最基本的操作:登入、开火、丢手雷

UML类图

Java设计模式-装饰模式:《穿越火线》RMB 玩家的快乐~

抽象构件:CFGameService

/**
 * cf游戏服务接口
 *
 * @author anlingyi
 */
public interface CFGameService {

    /**
     * 登入
     * @param username
     * @param password
     */
    void login(String username, String password);

    /**
     *  开枪射击
     */
    void fire();

    /**
     * 丢手雷
     */
    void grenade();
}
复制代码

具体构件:CFerServiceImpl

/**
 * cf游戏者实现类
 *
 * @author anlingyi
 */
public class CFerServiceImpl implements CFGameService {

    @Override
    public void login(String username, String password) {
        System.out.println(username + ", 登入游戏成功!");
    }

    @Override
    public void fire() {
        System.out.println("开火。。。");
    }

    @Override
    public void grenade() {
        System.out.println("丢雷。。。");
    }
}
复制代码

抽象装饰者:CFGameDecorator

/**
 * cf游戏装饰类
 */
public abstract class CFGameDecorator implements CFGameService {

    /**
     * 被装饰的对象
     */
    private CFGameService cfGameService;

    /**
     * 通过构造函数传递被修饰对象
     * @param cfGameService
     */
    public CFGameDecorator(CFGameService cfGameService) {
        this.cfGameService = cfGameService;
    }
    
    @Override
    public void login(String username, String password) {
        this.cfGameService.login(username, password);
    }

    @Override
    public void fire() {
        this.cfGameService.fire();
    }

    @Override
    public void grenade() {
        this.cfGameService.grenade();
    }
}
复制代码

具体的装饰类:ArmsDecorator、EffectDecorator

/**
 * 武器装饰类
 *
 * @author anlingyi
 */
public class ArmsDecorator extends CFGameDecorator {

    public ArmsDecorator(CFGameService cfGameService) {
        super(cfGameService);
    }

    @Override
    public void fire() {
        // 增强武器
        this.useFirearms();
        super.fire();
    }

    @Override
    public void grenade() {
        // 增强手雷
        this.useGrenade();
        super.grenade();
    }

    /**
     * 增强武器的方法
     */
    private void useFirearms() {
        System.out.println("装备:AK-47-火麒麟");
    }

    /**
     * 增强手雷的方法
     */
    private void useGrenade() {
        System.out.println("装备:高爆手雷");
    }
}
复制代码
/**
 * 效果装饰类
 *
 * @author anlingyi
 */
public class EffectDecorator extends CFGameDecorator {

    public EffectDecorator(CFGameService cfGameService) {
        super(cfGameService);
    }

    @Override
    public void login(String username, String password) {
        // vip会员
        System.out.println("尊贵的vvvvvip会员");
        super.login(username, password);
    }

    @Override
    public void fire() {
        super.fire();
        // 增加击杀音效
        this.killSound();
    }

    @Override
    public void grenade() {
        super.grenade();
        // 增加丢手雷音效
        this.grenadeSound();
    }

    /**
     * 增加击杀音效
     */
    private void killSound() {
        System.out.println("嘿帅!");
    }

    /**
     * 增加丢手雷的音效
     */
    private void grenadeSound() {
        System.out.println("发呀的轰!");
    }
}
复制代码

开始游戏

平民玩家进入了游戏。。。

/**
 * cf客户端
 *
 * @author anlingyi
 */
public class CFClient {

    public static void main(String[] args) {
        CFGameService cf = new CFerServiceImpl();
        cf.login("小毅", "123456");
        cf.fire();
        cf.grenade();
    }
}
复制代码

游戏效果:

小毅, 登入游戏成功!
开火。。。
丢雷。。。
复制代码

毫无乐趣可言。

Java设计模式-装饰模式:《穿越火线》RMB 玩家的快乐~

“这个问题充钱就能解决” —— 老子(子读一声)

RMB玩家进入了游戏。。。

/**
 * cf客户端
 *
 * @author anlingyi
 */
public class CFClient {

    public static void main(String[] args) {
        CFGameService cf = new CFerServiceImpl();
        // 充钱充钱(修饰武器)
        cf = new ArmsDecorator(cf);
        cf.login("小毅", "123456");
        cf.fire();
        cf.grenade();
    }
}
复制代码

游戏效果:

小毅, 登入游戏成功!
装备:AK-47-火麒麟
开火。。。
装备:高爆手雷
丢雷。。。
复制代码

瞬间NB多了,连隔壁小孩都馋哭了。。。哈哈哈~

Java设计模式-装饰模式:《穿越火线》RMB 玩家的快乐~

继续充

/**
 * cf客户端
 *
 * @author anlingyi
 */
public class CFClient {

    public static void main(String[] args) {
        CFGameService cf = new CFerServiceImpl();
        // 充钱充钱(修饰武器)
        cf = new ArmsDecorator(cf);
        // 再充(修饰效果)
        cf = new EffectDecorator(cf);
        cf.login("小毅", "123456");
        cf.fire();
        cf.grenade();
    }
}
复制代码

游戏效果:

尊贵的vvvvvip会员
小毅, 登入游戏成功!
装备:AK-47-火麒麟
开火。。。
嘿帅!
装备:高爆手雷
丢雷。。。
发呀的轰!
复制代码

越充越NB,越NB越好玩,越好玩越充。。。从此,在贫困的道路上越走越远。

Java设计模式-装饰模式:《穿越火线》RMB 玩家的快乐~

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Design systems

Design systems

Not all design systems are equally effective. Some can generate coherent user experiences, others produce confusing patchwork designs. Some inspire teams to contribute to them, others are neglected. S......一起来看看 《Design systems》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

html转js在线工具
html转js在线工具

html转js在线工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具