1、middleware technology and application 第一部分第一部分 设计模式简介设计模式简介一、什么是设计模式一、什么是设计模式 1设计模式“设计模式(pattern)是从许多优秀的软件系统中总结出的成功的可复用的设计方案”。2GOF之说“尽管Alexander所指的是城市和建筑设计模式,但他的思想也同样适用于面向对象设计模式,只是在面向对象的解决方案里,我们用对象和接口代替了墙壁和门窗。两类模式的核心都在于提供了相关问题的解决方案”。middleware technology and application模式的四个基本要素1名称名称 一个模式的名称高度概括该模式的
2、本质,有利于该行业统一术语、便于交流使用。2问题问题 描述应该在何时使用模式,解释设计问题和问题存在的前因后果,描述在怎样的环境下使用该模式。3方案方案 描述设计的组成部分,它们之间的相互关系及各自的职责和协作方式。4效果效果 描述模式的应用效果及使用模式应当权衡的问题。主要效果包括使用模式对系统的灵活性、扩充性和复用性的影响。middleware technology and application模式的四个基本要素例如,GOF之书如下记录中介者模式:名称名称 中介者 问题问题 用一个中介者来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之
3、间的交互。方案方案 中介者(Mediator)接口、具体中介者(ConcreteMediator)、同事(Colleague)、具体同事(ConcreteColleague)。效果效果 减少了子类的生成、将各个同事解耦、简化了对象协议、控制集中化。middleware technology and application二、设计模式的起源二、设计模式的起源 软件领域的设计模式起源主要是受到1977年建筑大师Alexander出版的A Pattern Language:Towns,Building,Construction一书。Alexander在其著作中将其建筑行业中的许多问题的最佳解决方案记
4、录为200多种模式,其思想不仅在建筑行业影响深远,而且很快影响到了软件设计领域。middleware technology and application 1987年,Kent Beck和Ward Cunningham将Alexander在建筑学上的模式观点应用于软件设计,开发了一系列模式,并用Smalltalk语言实现了雅致的用户界面。Kent Beck和Ward Cunningham在1987年举行的一次面向对象的会议上发表了论文:在面向对象编程中使用模式,该论文发表后,有关软件的设计模式论文以及著作相继出版。1 设计模式的起源设计模式的起源middleware technology an
5、d application2 GOF之著作之著作1目前,被公认在设计模式领域最具影响力的著作是Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides在1994年合作出版的著作:Design Patterns:Elements of Reusable Object-Oriented Software(中译本设计模式:可复用的面向对象软件的基本原理。2该书的四位作者在其著作中记录了他们在四年多的工作中所发现的23个模式。3设计模式一书被广大喜爱者昵称为GOF(Gang of Four)之书,被认为是学习设计模式的必读著作。被公认为是设计模式领域的
6、奠基之作。middleware technology and application3 学习设计模式的重要性学习设计模式的重要性1一个好的设计系统往往是易维护、易扩展、易复用的。2有经验的设计人员或团队知道如何使用面向对象语言编写出易维护、易扩展和易复用的程序代码。3设计模式一书正是从这些优秀的设计系统中总结出的设计精髓。4学习设计模式对提高设计能力无疑是非常有帮助的,尽管GOF之书并没有收集全部的模式,但所阐述的23种模式无疑是使用频率最高的模式。5设计模式的目的不是针对软件设计和开发中的每个问题都给出解决方案,而是针对某种特定环境中通常都会遇到的某种软件开发问题给出的可重用的一些解决方案。
7、middleware technology and application6学习设计模式不仅可以使我们使用好这些成功的模式,更重要的是可以使我们更加深刻地理解面向对象的设计思想,非常有利于我们更好地使用面向对象语言解决设计中的问题。7学习设计模式对于进一步学习、理解和掌握框架是非常有帮助的,比如Java EE中就大量使用了设计模式一书中的模式,对于熟悉设计模式的开发人员,很容易理解这些框架的结构,继而很好地使用框架来设计他们的系统。学习设计模式的重要性学习设计模式的重要性middleware technology and application8设计模式一书所总结的成功模式不仅适合于面向对象语
8、言,其思想及解决问题的方式也适合于任何和设计相关的行业,因此学习掌握设计模式无疑是非常有益的。学习设计模式的重要性学习设计模式的重要性middleware technology and application合理使用模式合理使用模式 不是软件的任何部分都需要套用模式来设计的,必须针对具体问题合理的使用模式。1.正确使用正确使用 当你设计某个系统,并确认所遇到的问题刚好适合使用某个模式,就可以考虑使用该模式到你的系统设计中,毕竟该模式已经被公认是解决该问题的成功方案,能使设计的系统易维护、可扩展性强、复用性好,而且这些经典的模式也容易让其他开发人员了解你的系统和设计思想。2.避免教条避免教条模式
9、不是数学公式、也不是物理定律、更不是软件设计中的“法律”条文,你完全可以修改模式中的部分结构以符合你的设计要求。middleware technology and application3.模式挖掘模式挖掘 模式不是用理论推导出来的,而是从真实世界的软件系统中被发现、按着一定规范总结出来的可以被复用的方案。许多文献或书籍里阐述的众多模式实际上都是GOF书中经典模式的变形,这些变形模式都经过所谓的“三次规则”,即该模式已经在真实世界的三个方案中被成功的采用。可以从某个系统中洞察出某种新模式,只要经过“三次规则”就会被行业认可。4.避免乱用避免乱用 不是所有的设计中都需要使用模式,因为模式不是发明
10、出来的,而是总结出来的,事实上,真实世界中的许多设计实例都没有使用过GOF之书中的经典模式。在进行设计时,尽可能用最简单的方式满足系统的要求,而不是费尽心机地琢磨如何在这个问题中使用模式.合理使用模式合理使用模式middleware technology and application5.了解反模式了解反模式 所谓反模式就是从某些软件系统中总结出的不好的设计方案,反模式就是告诉你如何采用一个不好的方案解决一个问题。既然是一个不好的方案,为何还有可能被重复使用呢?这是因为,这些不好的方案表面上往往有很强的吸引力,人们很难一眼就发现它的弊端,因此,发现一个反模式也是非常有意义的工作。在有了一定的设
11、计模式的基础之后,你可以用搜索引擎查找有关反模式的信息,这对于学习好设计模式也是非常有帮助的。合理使用模式合理使用模式middleware technology and application 一个设计中,可能并不需要使用模式就可以很好地满足系统的要求,如果牵强地使用某个模式可能会在系统中增加许多额外的类和对象,影响系统的性能,因为大部分设计模式往往会在系统中加入更多的层,这不但增加复杂性,而且系统的效率也会下降。合理使用模式合理使用模式middleware technology and application什么是框架什么是框架 框架不是模式,框架是针对某个领域,提供用于开发应用系统的类的集
12、合,程序设计者可以使用框架提供的类设计一个应用程序,而且在设计应用程序时可以针对特定的问题使用某个模式。1层次不同层次不同 模式比框架更抽象,模式是在某种特定环境中,针对一个软件设计出现的问题而给出的可复用的解决方案,不能向使用者提供可以直接使用的类,设计模式只有在被设计人员使用时才能表示为代码,middleware technology and application 例如,GOF描述的中介者模式:“用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互”,该模式在解决方案中并没有提供任何类的代码,只是说明设计者可以针对特
13、定的问题使用该模式给出的方案。框架和模式不同,它不是一种可复用的设计方案,它是由可用于设计解决某个问题的一些类组成的集合,程序设计人员通过使用框架提供的类或扩展框架提供的类进行应用程序的设计,例如。在Java中,开发人员使用Swing框架提供的类设计用户界面;使用Set(集合)框架提供的类处理数据结构相关的算法等。什么是框架什么是框架middleware technology and application2范围不同 模式本质上是逻辑概念,以概念的形式而存在,模式所描述的方案独立于编程语言。Java程序员、C+程序员或SmallTalk程序员都可以在自己的系统设计中使用某个模式。框架的应用的范
14、围是很具体的,它们不是以概念的形式而存在,而是以具体的软件组织而存在,只能被特定的软件设计者使用,比如Java提供的 Swing框架只能为Java应用程序所使用。什么是框架什么是框架middleware technology and application3相互关系相互关系 一个框架往往会包括多个设计模式,它们是面向对象系统获得最大复用的方式,较大的面向对象应用会由多层彼此合作的框架组成,例如,Java Web设计中的Struts,Spring和Hibernate等框架。框架变得越来越普遍和重要,导致许多开源框架的出现,而且一个著名的框架往往是许多设计模式的具体体现,我们甚至可以在一些成功的框
15、架中挖掘出新的模式。什么是框架什么是框架middleware technology and application使用使用Java描述模式的必要性描述模式的必要性 Java不仅可以用来开发大型的桌面应用程序,而且特别适合于Internet的应用开发。目前,Java语言不仅是一门正在被广泛使用的编程语言,而且已成为软件设计开发者应当掌握的一门基础语言。GOF之书无疑是经典之作,但是该书中的示例代码相当简练,而且是采用C+描述的,另外C+中提到的接口就是指类的方法,但是在Java中,类和接口是两个不同的概念。所以采用Java语言讲解GOF之书中的23个模式,其原因不仅是因为Java语言的广泛使用,
16、而且希望设计模式的学习更加适合具有一定Java语言基础的学生和程序员。middleware technology and application第二部分,UML类图简介 Student+name:String#age:int-money:double+setName(String):void#printMess():void+getAge():intsetAge(int):void-getMoney();1.类类(Class)middleware technology and applicationCreator+MAX:int+factoryMethod():Product2.接口(接口(I
17、nterface)middleware technology and application3.泛化关系(继承关系,泛化关系(继承关系,Generalization)middleware technology and application4.关联关系(关联关系(Association)middleware technology and application5.依赖关系(依赖关系(Dependency)middleware technology and application6.实现关系(实现关系(Realization)middleware technology and applicati
18、on第三部分第三部分 面向对象的几个基本原则面向对象的几个基本原则3.1 面向抽象原则面向抽象原则1抽象类和接口抽象类和接口(1)抽象(abstract)类 抽象(abstract)类具有如下特点:抽象类中可以有abstract方法,也可以有非abstract方法。抽象类不能用new运算符创建对象。如果一个非抽象类是某个抽象类的子类,那么它必须重写父类的abstract方法,即在子类中将abstract方法重新声明,但必须去掉abstract修饰符,同时要保证声明的方法名字、返回类型、参数个数和类型与父类的abstract方法完全相同。尽管抽象类不能用new运算符创建对象,但它的非abstra
19、ct子类必须要重写它中的全部abstract方法,这样一来,就可以让抽象类声明的对象成为其子类对象的上转型对象,并调用抽象类声明的对象成为其子类对象的上转型对象,并调用子类重写的方法。子类重写的方法。middleware technology and application(1)抽象类)抽象类 public abstract class A public abstract int add(int x,int y);public B extends A public int add(int x,int y)return x+y;public Application public static v
20、oid main(String args)A a;a=new B();/a是B类对象的上转型对象 int m=a.add(3,2);middleware technology and application(2)接口 接口(interface)具有如下特点:接口中只可以有public权限的abstract方法,不能有非abstract方法。接口由类去实现,即一个类如果实现一个接口,那么它必须重写接口中的abstract方法,即将abstract方法重新声明,但必须去掉abstract修饰符,同时要保证声明的方法名字、返回类型、参数个数和接口中的方法完全相同。接口回调。接口回调是指可以把实现接口
21、的类的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口中的方法,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象方法的接口回调。middleware technology and application(2)接口)接口public interface Com public abstract int sub(int x,int y);Class ComImp implements Com public int sub(int x,int y)return x-y;public Application public static
22、 void main(String args)Com com com=new ComImp();/com变量存放ComImp类对象的引用 int m=com.sub(5,2);/com回调ComImp类实现的接口方法 system.out.println(m);middleware technology and application 3.1 面向抽象原则面向抽象原则 所谓面向抽象编程,是指当设计一个类时,不让该类面向具体的类,而是面向抽象类或接口,即所设计类中的重要数据是抽象类或接口声明的变量,而不是具体类声明的变量。middleware technology and application
23、3.2 开开-闭原则闭原则 所谓“开-闭原则”(Open-Closed Principle)就是让你的设计应当对扩展开放扩展开放,对修改关闭对修改关闭。实际上这句话的本质是指当一个设计中增加新的模块时,不需要修改现有的模块。我们在给出一个设计时,应当首先考虑到用户需求的变化,将应对用户变化的部分设计为对扩展开放,而设计的核心部分是经过精心考虑之后确定下来的基本结构,这部分应当是对修改关闭的,即不能因为用户的需求变化而再发生变化,因为这部分不是用来应对需求变化的。middleware technology and application如果您的设计遵守了“开-闭原则”,那么这个设计一定是易维护的
24、,因为在设计中增加新的模块时,不必去修改设计中的核心模块。比如,我们在2.1节给出的设计中有4个类,类图如下:middleware technology and application 通常我们无法让设计的每个部分都遵守“开-闭原则”,甚至不应当这样去做,我们应当把主要精力集中在应对设计中最有可能因需求变化而需要改变的地方,然后想办法应用“开-闭原则”。当设计某些系统时,我们经常需要面向抽象来考虑系统的总体设计,不要考虑具体类,这样就容易设计出满足“开-闭原则”的系统,在程序设计好后,首先对abstract类的修改关闭,否则,一旦修改abstract类,比如,为它再增加一个abstract方法
25、,那么abstract类所有的子类都需要做出修改;应当对增加abstract类的子类开放,即在程序中再增加子类时,不需要修改其它面向抽象类而设计的重要类。middleware technology and application3.3 多用组合少用继承原则 之所以提倡多用组合,少用继承,是因为在许多设计中,人们希望系统的类之间尽量是低耦合的关系,而不希望是强偶合关系。即在许多情况下需要避开继承的缺点,而需要组合的优点。怎样合理地使用组合,而不是使用继承来获得方法的复用需要经过一定时间的认真思考、学习和编程实践才能悟出其中的道理,这也是促使我们学习设计模式的原因之一。关于多用组合,少用继承,在后
26、面的设计模式中,比如装饰模式,策略模式以中介者模式中都有体现。middleware technology and application3.4 高内聚高内聚-低耦合原则低耦合原则 如果类中的方法是一组相关的行为,则称该类是高内聚的,反之称为低内聚的。高内聚便于类的维护,而低内聚不利于类的维护,学习后面迭代器模式时,会更深刻体会到这一原则。所谓低耦合就是尽量不要让一个类含有太多的不要让一个类含有太多的其它类的实例的引用其它类的实例的引用,以避免修改系统的其中一部分会影响到其它部分,比如在后面学习中介者模式时,就会体会到这一原则。模式设计参考网站:http:/ technology and app
27、lication第四部分 23种设计模式 命令模式命令模式 别名别名 动作动作事务事务)Command pattern 将一个请求封装为一个对象从而使用户可用不同的请求对客户进行参数化对请求排队或记录请求日志以及支持可撤销的操作。middleware technology and application命令模式中的四种角色命令模式中的四种角色 接收者(Receiver):是一个类的实例,该实例负责请求与执行相关的操作。命令接口(Command):规定了用来封装请求的若干方法,如execute(),undo().具体命令(ConcreteCommand):是实现命令接口的具体实例 请求者(Inv
28、oke):是一个包含Command接口变量的类的实例。middleware technology and application命令模式对应的四种角色middleware technology and application命令模式的命令模式的UML类图类图middleware technology and application命令模式的代码实现 public interface Command public abstract void execute();public class ConcreteCommand implements Command CompanyArmy army;/含有
29、接收者的引用 ConcreteCommand(CompanyArmy army)this.army=army;public void execute()/封装着指挥官的请求 army.sneakAttack();/偷袭敌人 middleware technology and application命令模式的代码实现 public class CompanyArmy public void sneakAttack()System.out.println(我们知道如何偷袭敌人,保证完成任务);public class ArmySuperior Command command;/用来存放具体命令的引
30、用 public void setCommand(Command command)mand=command;public void startExecuteCommand()command.execute();middleware technology and application命令模式的代码实现public class Application public static void main(String args)CompanyArmy 三连=new CompanyArmy();/创建接收者 Command command=new ConcreteCommand(三连);/创建具体命令并
31、指定接收者 ArmySuperior 指挥官=new ArmySuperior();/创建请求者 指挥官.setCommand(command);指挥官.startExecuteCommand();middleware technology and application命令接口中的撤销操作middleware technology and application策略模式 Strategy Pattern 策略模式策略模式(别名:政策(别名:政策 Police)定义一系列算法,把它们一个个封装起来,定义一系列算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独并且使它们可相互替
32、换。本模式使得算法可独立于使用它的客户而变化。立于使用它的客户而变化。middleware technology and application策略模式概述策略模式概述1类中一个方法的方法体由一系列语句构成,方法的方法体是一个算法。2比如,Army类,该类中有一个int型数组,数组元素的值代表士兵的号码,该类中有lineUp(),该方法将士兵按他们的号码从小到大排队.3Army类创建的任何对象,比如“三连长”,“四连长”等,调用lineUp()方法只能将自己所管理的士兵按其号码从小到大排队.4需求变化。需求变化可能导致经常需要修改类中某个方法的方法体,即修改算法。有些部队希望Army创建的“连
33、长”能将士兵按着他们的号码从大到小排队(不是从小到大),或将士兵按着他们的号码的某种排列来排队。middleware technology and application策略模式概述策略模式概述5问题出现。Army无法提供这样的对象(设计不合理).6.不正确地解决问题。痛苦地修改lineUp()的方法体,但马上就发现这样做也不行,因为一旦将lineUp()的方法体修改成把士兵按着他们的号码从大到小来排队,那么又无法满足某些部队希望Army创建的“连长”能将自己的士兵从小到大排序;也许我们可以在lineUp()方法中添加多重条件语句,以便根据用户的具体需求决定怎样排队,但这也不是一个好办法,因为
34、只要一旦有新的需求,就要修改lineUp()方法添加新的判断语句,而且针对某个条件语句的排队代码也可能因该用户的需求变化导致重新编写。middleware technology and application7我们发现问题的实质:问题的症结就是Army类的lineUp()方法体中的代码(具体算法)需要经常地发生变化。8寻找解决办法。面向对象编程有一个很好的设计原则:“面向抽象编程”,该原则的核心就是将类中经常需要变化的部分分割出来,并将每种可能的变化对应地交给抽象类的一个子类或实现接口的一个类去负责,从而让类的设计者不去关心具体实现,避免所设计的类依赖于具体的实现。现在,我们面向接口(抽象类)
35、来重新设计现在,我们面向接口(抽象类)来重新设计Army类,类,让让Army类依赖于类依赖于Strategy接口,即接口,即Army类含有一个类含有一个Strategy接口声明的变量,并重新编写接口声明的变量,并重新编写lineUp()的方法体中的方法体中的代码,其主要代码是委托的代码,其主要代码是委托Army类中的类中的Strategy接口变量接口变量调用调用arrange(int a)方法,类图如图方法,类图如图1.4 策略模式概述策略模式概述middleware technology and application策略模式策略模式UML类图类图middleware technology
36、and application9总结出办法:策略模式。策略模式是处理算法的不同变体的一种成熟模式,策略模式通过接口或抽象类封装算法的标识,即在接口中定义一个抽象方法,实现该接口的类将实现接口中的抽象方法。策略模式把针对一个算法标识的一系列具体算法分别封装在不同的类中,使得各个类给出的具体算法可以相互替换。在策略模式中,封装算法标识的接口称作策略,实现该接口的类称作具体策略。以下给出策略模式的类图,并详细阐述该模式中各个角色的职责。策略模式概述策略模式概述middleware technology and application策略模式的结构中包括三种角色:策略(Strategy):策略是一个接
37、口,该接口定义若干个算法标识,即定义了若干个抽象方法。具体策略(ConcreteStrategy):具体策略是实现策略接口的类。具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体算法。上下文(Context):上下文是依赖于策略接口的类,即上下文包含有策略声明的变量。上下文中提供一个方法,该方法委托策略变量调用具体策略所实现的策略接口中的方法。策略模式的角色middleware technology and application策略模式的UML类图 middleware technology and application public interface ComputableStr
38、ategy public abstract double computeScore(double a);public class StrategyOne implements ComputableStrategy public double computeScore(double a)double score=0,sum=0;for(int i=0;ia.length;i+)sum=sum+ai;score=sum/a.length;return score;middleware technology and applicationpublic class GymnasticsGame Com
39、putableStrategy strategy;public void setStrategy(ComputableStrategy strategy)this.strategy=strategy;public double getPersonScore(double a)if(strategy!=null)return puteScore(a);else return 0;middleware technology and applicationpublic class Application public static void main(String args)GymnasticsGa
40、me game=new GymnasticsGame();/上下文对象 game.setStrategy(new StrategyOne();/上下文对象使用 .middleware technology and application策略模式的优点 上下文(Context)和具体策略(ConcreteStragy)是松耦合关系 策略模式满足“开-闭原则”满足需要使用一个算法的不同变体。middleware technology and application装饰模式 Decorator Pattern 别名:别名:包装器包装器 Wrapper 动态地给对象添加一些额外的职责。就功动态地给对象
41、添加一些额外的职责。就功能来说装饰模式相比生成子类更为灵活。能来说装饰模式相比生成子类更为灵活。middleware technology and application装饰模式概述概述1在许多设计中,可能需要改进类的某个对象的功能,而不是该类创建的全部对象。2比如,麻雀类的实例(麻雀)能连续飞行100米,如果我们用麻雀类创建了5只麻雀,那么这5只麻雀都能连续飞行100米。3需求变化。假如想让其中一只麻雀能连续飞行150米,那应当怎样做呢?我们不想通过修改麻雀类的代码(也可能根本不允许我们修改)使得麻雀类创建的麻雀都能连续飞行150米,这也不符合需求:改进类的某个对象的功能。4不正确地解决问题
42、middleware technology and application装饰模式概述概述5寻找解决办法。一种比较好的办法就是给麻雀装上智能电子翅膀。智能电子翅膀可以使得麻雀不使用自己的翅膀就能飞行50米。那么一只安装了这种智能电子翅膀的麻雀就能飞行150米,因为麻雀首先使用自己的翅膀飞行100米,然后电子翅膀开始工作再飞行50米。6正确的解决办法:装饰模式。装饰模式是动态地扩展一个对象的功能,而不需要改变原始类代码的一种成熟模式。middleware technology and application 7关键术语。(1)具体组件具体组件称作“被装饰者”。(2)具体装饰具体装饰称为“装饰者”
43、。8关键技术“具体装饰”需要包含有“具体组件”的一个实例的引用,以便装饰“被装饰者”。如图2.1。middleware technology and application 麻雀类就是“具体组件”,而一只麻雀就是“具体组件”的一个实例,即是一个“被装饰者”,而按装了电子翅膀的麻雀就是“具体装饰”的一个实例,即按装了电子翅膀的麻雀就是麻雀的“装饰者”。比如,麻雀类有一个fly方法,麻雀类的实例调用fly能飞行100米,如图2.2 middleware technology and application “具体装饰”类的fly方法能飞行150米,装饰类的eleFly方法能飞行50米,麻雀类的fl
44、y方法能飞行100米。“具体装饰”类的实例调用fly麻雀类的fly方法能飞100米。调用fly图2.2 麻雀类的fly方法麻雀类的实例 “具体装饰”也有一个和麻雀类同名的fly()方法,另外还有一个自己独特的新方法eleFly()方法。由于“具体装饰”类包含有一只麻雀的引用,因此“具体装饰”类可以将它的fly()方法实现为:首先委托麻雀调用fly()方法飞行100米,然后再调用eleFly()方法飞行50米。因此,“具体装饰”类的实例调用fly()方法能飞行150米,如图2.3。middleware technology and application装饰模式的结构中包括四种角色:抽象组件(C
45、omponent):抽象组件是一个抽象类。抽象组件定义了“被装饰者”需要进行“装饰”的方法。具体组件(ConcreteComponent):具体组件是抽象组件的一个子类,具体组件的实例称作“被装饰者”。装饰(Decorator):装饰是抽象组件的一个子类,装饰包含有一个抽象组件声明的变量以保存“被装饰者”的引用。装饰可以是抽象类也可以是一个非抽象类,如果是非抽象类,那么该类的实例称作“装饰者”。具体装饰(ConcreteDecotator):具体装饰是装饰的一个非抽象子类,具体装饰的实例称作“装饰者”。装饰模式的角色middleware technology and application装饰
46、模式的UML类图 middleware technology and application装饰模式的程序举例public abstract class Bird public abstract int fly();public class Sparrow extends Bird public final int DISTANCE=100;public int fly()return DISTANCE;middleware technology and application装饰模式的程序举例public abstract class Decorator extends Bird prote
47、cted Bird bird;public Decorator()public Decorator(Bird bird)this.bird=bird;middleware technology and applicationpublic class SparrowDecorator extends Decorator public final int DISTANCE=50;/eleFly方法能飞50米 SparrowDecorator(Bird bird)super(bird);public int fly()int distance=0;distance=bird.fly()+eleFly
48、();return distance;private int eleFly()/装饰者新添加的方法 return DISTANCE;middleware technology and applicationpublic class Application public void needBird(Bird bird)int flyDistance=bird.fly();System.out.println(这只鸟能飞行+flyDistance+米);public static void main(String args)Application client=new Application();
49、Sparrow sparrow=new Sparrow();SparrowDecorator sparrowDecorator1=new SparrowDecorator(sparrow);SparrowDecorator sparrowDecorator2=new SparrowDecorator(sparrowDecorator1);client.needBird(sparrowDecorator1);client.needBird(sparrowDecorator2);middleware technology and application观察者模式(Observer pattern)
50、观察者模式(别名:依赖,发布-订阅)定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象得到通知并被自动改变。观察者模式是关于多个对象想知道一个对象中数据变化情况的一种成熟的模式。观察者模式中有一个称作“主题”的对象和若干个称作“观察者”的对象。middleware technology and application观察者模式(Observer pattern)观察者模式的结构中包括四种角色:主题:是一个接口,该接口规定了具体主题需要实现的方法,比如:添加、删除观察者,以及通知观察者更新数据的方法。观察者:是一个接口,该接口规定了具体观察者用来更新数据的方法。具体主