《魂斗罗归来》之代理模式VS装饰模式
来源:互联网 发布:域名的名词解释 编辑:程序博客网 时间:2024/05/14 19:11
欢迎收看俗到掉渣的《小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手雷辅助攻击!集速手雷辅助!
- 装饰类对被装饰类的行为没有决定权,只有加强作用,它不决定被代理的方法是否被执行,只是起到增强或者减弱被代理的功能。比尔·雷泽的武器输出并不固定,在输出的过程中还可以通过组合确定。
- 装饰模式的本质是动态组合。每个装饰类负责添加一些额外的功能,然后通过组合为被装饰类添加负复杂功能,每个装饰类的职责比较简单,增加可重用性,符合单一职责原则。
三、小结
- 代理模式目标是控制对被代理对象的访问,把当前的行为或功能委托给其他对象执行,不对被代理对象做任何的处理,负责接口限定;装饰模式是在要保证接口不变的情况下加强类的功能,保证的是被装饰的对象功能比原始的丰富或者减弱。
- 代理类所代理的类的行为完全由代理类确定;装饰模式的对象需要根据实际组合来确定。
阅读全文
0 0
- 《魂斗罗归来》之代理模式VS装饰模式
- 《魂斗罗归来》之状态模式VS策略模式
- 代理模式 vs 装饰模式
- Java设计模式(六) 代理模式 VS. 装饰模式
- Java设计模式(六) 代理模式 vs. 装饰模式
- 装饰模式、代理模式
- 跟我学设计模式视频教程——装饰模式,装饰模式VS代理模式
- Java模式之装饰者模式&代理模式 装饰模式与代理模式区别
- 设计模式学习之装饰模式和代理模式
- 设计模式之--装饰模式与代理模式的区别
- java设计模式之装饰模式代理模式区别
- 设计模式之代理模式,装饰模式和继承
- 设计模式之代理模式和装饰者模式
- 设计模式之代理模式and装饰者模式
- 装饰模式 VS. 外观模式
- DP-装饰模式、代理模式
- 装饰模式和代理模式
- 装饰者模式&代理模式
- 图像分类识别—蒙特卡罗法—拉斯维加斯
- # Ubuntu中 安装,卸载 网易云音乐
- JVM内存模型
- linux下用rpm 安装jdk
- rabbitMQ安装详细的步骤以及案例演示、集群方法
- 《魂斗罗归来》之代理模式VS装饰模式
- 计算并输出一个三位数的各位、十位和百位数字之和。
- Oracle expdp定时备份脚本
- android中利用矢量图VectorDrawable打造酷炫动画
- css3的媒体查询
- MT6737 Android N 平台 Audio系统学习----ALSA Driver
- Jenkins + maven + git 实现持续集成
- Hadoop与Spark算法分析(四)——PageRank算法
- Shiro AuthenticationException 身份认证异常