从LOL金克斯的不解释连招学习装饰者模式

装饰者模式

贴一个百度都是复制粘贴的定义:
装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。就增加功能来说,Decorator模式比生成子类更为灵活。

灵活两个字太重要了,这样我就可以把执行的顺序任意切换,因为都是这个角色的附加功能。我就想到英雄联盟中的不解释连招好像就可以这样玩。还记得大司马的奥巴马的连招:weaaqaa 。帅,哈哈。我就用我喜欢的金克斯角色解析一下,装饰者这样玩。

1.定义一个基础接口,一个移动方法,用于被装饰者实现:

public interface Technique {
    void move();
}

2.定义一个金克斯角色,也就是装饰者去实现:

public class JINX implements Technique {

    @Override
    public void move() {
        System.out.println("移动");
    }
}

3.定义一个装饰者的抽象类,要与被装饰者具体对象实现同一个接口,并且要持有一个具体实例:

public class SuperTechnique implements Technique {
    Technique technique;

    SuperTechnique(Technique technique){
        this.technique = technique;
    }
    @Override
    public void move() {
        technique.move();
    }
}

4.具体的修饰者继承抽象类,平a:

public class ATechnique extends SuperTechnique{

    ATechnique(Technique technique) {
        super(technique);
    }

    public void attack(){
        System.out.println("基础平A");
    }

    @Override
    public void move() {
        super.move();
        attack();
    }

}

5.Q技能:

public class QTechnique extends SuperTechnique {

    QTechnique(Technique technique) {
        super(technique);
    }
    public void guns(){
        System.out.println("Q 枪炮交响曲");
    }

    @Override
    public void move() {
        super.move();
        guns();
    }
}

6.W技能:

public class WTechnique extends SuperTechnique{

    WTechnique(Technique technique) {
        super(technique);
    }
    public void electron(){
        System.out.println("W 震荡电磁波");
    }

    @Override
    public void move() {
        super.move();
        electron();
    }
}

7.E技能:

public class ETechnique extends SuperTechnique{

    ETechnique(Technique technique) {
        super(technique);
    }

    public void grenade(){
        System.out.println("E 嚼火者手雷");
    }

    @Override
    public void move() {
        super.move();
        grenade();

    }
}

8.R技能:

public class RTechnique extends SuperTechnique{
    RTechnique(Technique technique) {
        super(technique);
    }
    public void missile(){
        System.out.println("R 超究极死神飞弹");
    }

    @Override
    public void move() {
        super.move();
        missile();
    }
}

9.F闪现:

public class Flashing extends SuperTechnique {
    Flashing(Technique technique) {
        super(technique);
    }

    public void flash(){
        System.out.println("F 闪现");
    }

    @Override
    public void move() {
        super.move();
        flash();
    }
}

10.现在定义一个游戏玩家:

public class Player {
    public static void main(String[] args) {

        System.out.println("-------------------");
        QTechnique qTechnique = new QTechnique(new JINX());
        qTechnique.move();

        System.out.println("------------------");
        RTechnique rTechnique = new RTechnique(new QTechnique(new Flashing(new ETechnique(new WTechnique(new JINX())))));
        rTechnique.move();

        System.out.println("------------------");
        RTechnique rTechnique2 = new RTechnique(new QTechnique(new QTechnique(new Flashing(new ATechnique(
                new ATechnique(new ETechnique(new WTechnique(new JINX()))))))));
        rTechnique2.move();
    }
}

输出结果如下:

-------------------
移动
Q 枪炮交响曲
------------------
移动
W 震荡电磁波
E 嚼火者手雷
F 闪现
Q 枪炮交响曲
R 超究极死神飞弹
------------------
移动
W 震荡电磁波
E 嚼火者手雷
基础平A
基础平A
F 闪现
Q 枪炮交响曲
Q 枪炮交响曲
R 超究极死神飞弹

Process finished with exit code 0

可以看出,采用最后一套不解释连招,可以直接五杀(doge),芜湖,起飞!
源码地址:https://github.com/viviandavid/spring-design-pattern

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值