Java中“装饰模式”和“代理模式”有啥区别
你是一个高傲的拳击运动员
你最擅长的事情是在擂台上为拿到四大组织的金腰带浴血奋战,但是健壮的你却并不熟悉如何挑选对手
对你来说,将精力放在留意其他拳手的战绩与比赛赏金上并不能提升你的实力水平,毕竟你会的只是Fight()这一个方法,你需要怎么打,自己在Fight()方法内定义就好了:public class BoxerImpl implements Boxer { private String name; private String wins; private String loses; @Override public void Fight() { Hook(); Straight(); Duck(); } void Duck() { System.out.println("拳手:闪避"); } void Hook(){ System.out.println("拳手:勾拳"); } void Straight(){ System.out.println("拳手:直拳"); }}但是寻找对手与赞助商的活是你通往无争议拳王之路上需要解决的第一个问题,所以你花了点钱雇来了一位经纪人Agent,他会在比赛前帮你找好配拳师并与赞助商洽谈好一切商业合作:public class Agent implements Boxer{ Boxer boxer; public Agent(Boxer boxer) { this.boxer = boxer; } void findOpponent(){ System.out.println("代理人:寻找适用于当前拳手的对手"); } void findSponsor(){ System.out.println("代理人:寻找赞助商"); } void Negotiate(){ System.out.println("代理人:洽谈"); } @Override public void Fight() {//安排自己的拳手去比赛 findOpponent(); findSponsor(); Negotiate(); System.out.println("让拳手去比赛"); boxer.Fight(); }}谈赞助,谈对手,请找我的经纪人
这样你就可以放心地将精力放在备赛上了。而经纪人则不关心你的攻击或防御策略,他只要做好自己擅长的就行了public class Test { public static void main(String args) { Boxer realBoxer = new BoxerImpl(); Boxer Agent = new Agent(realBoxer); System.out.println("准备比赛!"); Agent.Fight(); System.out.println("比赛结束"); }}
让别人帮助你做你并不关心的事情,这是代理模式
现在你有了善于挑选对手的经纪人,你的拳击生涯开始变得逐渐明朗起来,胜利对你而言也如同家常便饭,你的赞助商仿佛看到了未来的种子选手,开始在你身上投放更多的商业广告,所有人都很高兴
但这样的同质化胜利必然会导致观众的厌倦,在经纪人的安排下你开始接触到更多实力强劲的对手,其中某些人曾经还获得过洲际拳王的金腰带。我们似乎可以觉察到故事中不祥的征兆,因为我们知道这世界总是存在着比你要强大的人:在某一次比赛中,对手的步伐比你要灵活的多,臂展比你长,对距离的把控堪称世界级,不善于强攻的你最终只能以点数告负,带着满头包黯然离场
在输了比赛后,你痛定思痛,反复反思自己的失误,同时在教练的指点下,你最终明白了自己失败的原因:你的鞋子过于老旧,无法提供足够的移速追上对手。为了能够面对defensive boxer不吃亏,你决定买一双新的拳击鞋武装自己。public class BoxerInReallyFastShoes implements Boxer { Boxer boxer; public BoxerInReallyFastShoes(Boxer boxer) { this.boxer = boxer; } void moveFast(){ System.out.println("穿上非常快的鞋:移速+5"); } @Override public void Fight() { boxer.Fight(); }}
推荐阅读
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
- Java工程师和C++工程师在工作上有啥区别哪个更适合自身发展
- 27岁,转行java的血与泪,该何去何从
- 怎样统计工程中未使用的java类
- 新互联网网站用Java还靠谱么对比Php,Python,Ruby的话
- 我想学java和安卓软件开发?
- 学计算机专业,java那些和网站开发选台式还是笔记本好
- JAVA设计思路
- 本人大专毕业一年,想要去培训,定了JAVAEE和安卓两个方向,应该学那个纠结,求帮助
- 从未接触过软件测试和java,可以学习主要是自学这两种其一吗
