封面Java设计模式2020/1/281第一章设计模式简介1.1什么是设计模式2020/1/282每一个设计模式描述一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次一次地使用该方案而不必做重复劳动。1.2设计模式的起源2020/1/283软件领域的设计模式起源于建筑学。1977年,建筑大师Alexander出版了《APatternLanguage:Towns,Building,Construction》一书。受Alexander著作的影响,KentBeck和WardCunningham在1987年举行的一次面向对象的会议上发表了论文:《在面向对象编程中使用模式》。1.3GOF之著作2020/1/284目前,被公认在设计模式领域最具影响力的著作是ErichGamma、RichardHelm、RalphJohnson和JohnVlissides在1994年合作出版的著作:《DesignPatterns:ElementsofReusableObject-OrientedSoftware》(中译本《设计模式:可复用的面向对象软件的基本原理》或《设计模式》),该书被广大喜爱者昵称为GOF(GangofFour)之书,被认为是学习设计模式的必读著作,GOF之书已经被公认为是设计模式领域的奠基之作。1.4学习设计模式的重要性2020/1/285学习设计模式不仅可以使我们使用好这些成功的模式,更重要的是可以使我们更加深刻地理解面向对象的设计思想,非常有利于我们更好地使用面向对象语言解决设计中的问题。1.5合理使用模式2020/1/2861.正确使用2.避免教条3.模式挖掘第二章面向对象的几个基本原则2.1面向抽象原则2020/1/287设计一个类时,不让该类面向具体的类,而是面向抽象类或接口。第二章面向对象的几个基本原则2020/1/288publicclassCircle{doubler;Circle(doubler){this.r=r;}publicdoublegetArea(){return3.14*r*r;}}publicclassPillar{Circlebottom;doubleheight;Pillar(Circlebottom,doubleheight){this.bottom=bottom;this.height=height;}}第二章面向对象的几个基本原则2020/1/289publicabstractclassGeometry{publicabstractdoublegetArea();}publicclassPillar{Geometrybottom;doubleheight;Pillar(Circlebottom,doubleheight){this.bottom=bottom;this.height=height;}}2.2开-闭原则2020/1/2810设计应当对扩展开放,对修改关闭。如果您的设计遵守了“开-闭原则”,那么这个设计一定是易维护的,因为在设计中增加新的模块时,不必去修改设计中的核心模块。2.3高内聚-低耦合原则2020/1/2811如果类中的方法是一组相关的行为,则称该类是高内聚的,反之称为低内聚的。所谓低耦合就是尽量不要让一个类含有太多的其它类的实例的引用,以避免修改系统的其中一部分会影响到其它部分。第四章命令模式2020/1/2812命令模式(别名:动作,事务)将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。CommandPattern(AnotherName:Action,Transaction)Encapsulatearequestasanobject,therebylettingyouparameterizeclientswithdifferentrequests,queueorlogrequests,andsupportundoableoperations.一、概述2020/1/2813在许多设计中,经常涉及到一个对象请求另一个对象调用其方法到达某种目的。如果请求者不希望或无法直接和被请求者打交道,即不希望或无法含有被请求者的引用,那么就可以使用命令模式。实例在军队作战中,指挥官请求三连偷袭敌人,但是指挥官不希望或无法直接与三连取得联系,那么可以将该请求:“三连偷袭敌人”形成一个“作战命令”。只要能让该作战命令被执行,就会实现三连偷袭敌人的目的。二、命令模式的结构与使用2020/1/2815模式的结构中包括四种角色:•接收者(Receiver)•命令(Command)接口•具体命令(ConcreteCommand)•请求者(Invoker)2020/1/2816模式的UML类图2020/1/2817模式的结构的描述与使用1.接收者(Receiver):CompanyArmy.javapublicclassCompanyArmy{publicvoidsneakAttack(){System.out.println(我们知道如何偷袭敌人,保证完成任务);}}2020/1/2818模式的结构的描述与使用2.命令(Command)接口:Command.javapublicinterfaceCommand{publicabstractvoidexecute();}2020/1/2819模式的结构的描述与使用3.具体命令(ConcreteCommand)ConcreteCommand.javapublicclassConcreteCommandimplementsCommand{CompanyArmyarmy;//含有接收者的引用ConcreteCommand(CompanyArmyarmy){this.army=army;}publicvoidexecute(){//封装着指挥官的请求army.sneakAttack();//偷袭敌人}}2020/1/2820模式的结构的描述与使用4.请求者(Invoker)ArmySuperior.javapublicclassArmySuperior{Commandcommand;//用来存放具体命令的引用publicvoidsetCommand(Commandcommand){this.command=command;}publicvoidstartExecuteCommand(){//让具体命令执行execute()方法command.execute();}}2020/1/2821模式的结构的描述与使用5.应用Application.javapublicclassApplication{publicstaticvoidmain(Stringargs[]){CompanyArmy三连=newCompanyArmy();Commandcommand=newConcreteCommand(三连);ArmySuperior指挥官=newArmySuperior();指挥官.setCommand(command);指挥官.startExecuteCommand();}}三、命令模式的优点2020/1/2822•在命令模式中,请求者(Invoker)不直接与接收者(Receiver)交互,即请求者(Invoker)不包含接收者(Receiver)的引用,因此彻底消除了彼此之间的耦合。•命令模式满足“开-闭原则”。如果增加新的具体命令和该命令的接受者,不必修改调用者的代码,调用者就可以使用新的命令对象;反之,如果增加新的调用者,不必修改现有的具体命令和接受者,新增加的调用者就可以使用已有的具体命令。四、应用举例•模拟带控制开关的小电器。该电器上有四个开关,两个一组,其中一组负责打开、关闭小电器上的照明灯,另一组负责打开、关闭小电器上的摄像头。第五章观察者模式2020/1/2824观察者模式(别名:依赖,发布-订阅)定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。ObserverPattern(AnotherName:Dependents,Publish-Subscribe)Defineaone-to-manydependencybetweenobjectssothatwhenoneobjectchangesstate,allitsdependentsarenotifiedandupdatedautomatically..一、概述2020/1/2825在许多设计中,经常涉及到多个对象都对一个特殊对象中的数据变化感兴趣,而且这多个对象都希望跟踪那个特殊对象中的数据变化。实例•某些寻找工作的人对“求职中心”的职业需求信息的变化非常关心,很想跟踪“求职中心”中职业需求信息的变化。“求职者”可以让“求职中心”把自己登记下来,这样求职中心就会及时通知她最新的职业信息需求。二、模式的结构与使用2020/1/2827观察者模式的结构中包括四种角色:•主题(Subject)•观察者(Observer)•具体主题(ConcreteSubject)•具体观察者(ConcreteObserver)2020/1/2828模式的UML类图2020/1/2829模式的结构的描述与使用1.主题:Subject.javapublicinterfaceSubject{publicvoidaddObserver(Observero);publicvoiddeleteObserver(Observero);publicvoidnotifyObservers();}2020/1/2830模式的结构的描述与使用2.观察者:Obsever.javapublicinterfaceObserver{publicvoidhearTelephone(StringheardMess);}2020/1/2831模式的结构的描述与使用3.具体主题SeekJobCenter.java_1importjava.util.ArrayList;publicclassSeekJobCenterimplementsSubject{Stringmess;booleanchanged;ArrayListObserverpersonList;SeekJobCenter(){personList=newArrayListObserver();mess=;changed=false;}publicvoidaddObserver(Observero){if(!(personList.contains(o)))personList.add(o);}publicvoiddeleteObserver(Observero){if(personList.contains(o))personList.remove(o);}2020/1/2832模式的结构的描述与使用3.具体主题SeekJobCenter.java_2publicvoidnotifyObservers(){if(changed){for(inti=0;ipersonList.size();i++){Observerobserver=personList.get(i);observer.hearTelephone(mess);}changed=false;}}publicvoidgiveNewMess(Stringstr){if(str.equals(mess))changed=false;else{mess=str;changed=true;}}}2020/1/2833模式的结构的描述与使用4.具体观察者_1UniversityStudent.javaimportjava.io.*;publicclassUniverStudentimplementsObserver{Subjectsubject;FilemyFile;UniverStudent(Subjectsubject,StringfileName){this.su