技术干货Java设计模式程序员

《魂斗罗归来》之代理模式VS装饰模式

2017-11-21  本文已影响0人  YoungManSter

欢迎收看俗到掉渣的《小Y讲堂》节目,大家好,我是小Y,一个集性感毛发与才华于一身的程序猿。小Y的设计模式系列中的「代理模式」「装饰模式」在前面已经总结过了,又是时候唠叨唠叨这两者之间在《魂斗罗归来》中的是是非非了。

一、模式介绍

1.通用UML的对比

从上图可以看到,代理模式和装饰模式的类图非常类似,装饰模式可以说是代理模式的一个特殊应用,两者的共同点是都具有相同的接口。

2.模式的介绍

小Y,你搞什么呀?都唠叨老半天了,怎么还不进入正题呀,区别区别!!!

客官,别急别急,小Y马上带你去爽爽...千万别想歪,我们是要干正事的!!我们的叼烟大汉比尔·雷泽马上就要跟大家见面。

二、代理模式下比尔·雷泽的武器输出

1.代理模式下武器输出的UML

2.代理模式下武器输出的代码实现

①武器输出接口类

 public interface IWeapon {
    void output();
}

②打小兵选择G5手雷辅助攻击

public class PlayCreeps implements IWeapon {

    @Override
    public void output() {
        System.out.print("散弹枪进行扫射!G5手雷辅助攻击!");
    }
}

③打大机选择集速手雷辅助

public class PlayBigMachine implements IWeapon {
    @Override
    public void output() {
        System.out.print("散弹枪进行扫射!集速手雷辅助!");
    }
}

④小Y代理

public class 小Y_Proxy implements IWeapon {

    private IWeapon weapon;
    public 小Y_Proxy(IWeapon weapon) {
        this.weapon=weapon;
    }

    @Override
    public void output() {
        weapon.output();
    }
}

⑤Client实现

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

        //打小兵使用G5手雷辅助
        PlayCreeps playCreeps=new PlayCreeps();
        小Y_Proxy 小Y_proxy=new 小Y_Proxy(playCreeps);
        小Y_proxy.output();
        //打大机使用集速手雷辅助
        PlayBigMachine playBigMachine=new PlayBigMachine();
        小Y_Proxy 小Y_proxy1=new 小Y_Proxy(playBigMachine);
        小Y_proxy1.output();
    }
}

输出的结果为:

①散弹枪进行扫射!G5手雷辅助攻击!
②散弹枪进行扫射!集速手雷辅助!

从实现代码中可以看出,在不改变接口的前提下,对武器输出进行控制。比尔·雷泽用什么武器有小Y决定的,小Y让比尔·雷泽携带打小兵型武器他就得带,小Y对比尔·雷泽的武器输出有绝对的控制权。

三、装饰模式下比尔·雷泽的武器输出

1.装饰模式下武器输出类图

2.装饰模式下武器输出的代码实现

①武器输出接口类

public interface IWeapon {
    void output();
}

②武器输出装饰抽象类

public abstract class PlayDecorator implements IWeapon {
    private IWeapon weapon;

    public PlayDecorator(IWeapon weapon) {
        this.weapon = weapon;
    }
    @Override
    public void output() {
        weapon.output();
    }
}

③打小兵使用G5手雷辅助攻击

public class PlayCreeps extends PlayDecorator {
    public PlayCreeps(IWeapon weapon) {
        super(weapon);
    }

    @Override
    public void output() {
        super.output();
        System.out.print("G5手雷辅助攻击!");
    }
}

④打大机使用集速手雷辅助

public class PlayBigMachine extends PlayDecorator {
    public PlayBigMachine(IWeapon weapon) {
        super(weapon);
    }

    @Override
    public void output() {
        super.output();
        System.out.print("集速手雷辅助!");
    }
}

⑤实现角色比尔·雷泽(对它进行装饰)

public class BillRizer implements IWeapon {
    @Override
    public void output() {
        //角色最基本的技能
        System.out.print("散弹枪进行扫射!");
    }
}

⑥Client实现

public class Client {
    public static void main(String[] args){
        //需要装饰的BillRizer
        BillRizer billRizer=new BillRizer();
        //打小兵使用G5手雷辅助
        PlayCreeps playCreeps=new PlayCreeps(billRizer);
        playCreeps.output();
        //打大机使用集速手雷辅助
        PlayBigMachine playBigMachine=new PlayBigMachine(playCreeps);
        playBigMachine.output();
    }
}

输出的结果为:

①散弹枪进行扫射!G5手雷辅助攻击!
②散弹枪进行扫射!G5手雷辅助攻击!集速手雷辅助!

三、小结

上一篇 下一篇

猜你喜欢

热点阅读