java设计模式课件耿祥义.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《java设计模式课件耿祥义.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 设计 模式 课件 耿祥义
- 资源描述:
-
1、封面Java设计模式设计模式 5/12/20221第一章第一章 设计模式简介设计模式简介 1.1 什么是设计模式什么是设计模式 5/12/20222 每一个设计模式描述一个在我们周围每一个设计模式描述一个在我们周围不断重复发生的问题,以及该问题的解不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次一次决方案的核心。这样,你就能一次一次地使用该方案而不必做重复劳动。地使用该方案而不必做重复劳动。1.2 设计模式的起源设计模式的起源 5/12/20223 软件领域的设计模式软件领域的设计模式起源于建筑学起源于建筑学。 19771977年,建筑大师年,建筑大师AlexanderAlex
2、ander出版了出版了A Pattern A Pattern LanguageLanguage:Towns, Building, ConstructionTowns, Building, Construction一一书。受书。受AlexanderAlexander著作的影响著作的影响 ,Kent BeckKent Beck和和Ward Ward CunninghamCunningham在在19871987年举行的一次面向对象的会议上年举行的一次面向对象的会议上发表了论文:发表了论文:在面向对象编程中使用模式在面向对象编程中使用模式。 1.3 GOF之著作之著作 5/12/20224 目前,被公
3、认在设计模式领域最具影响力的著作是目前,被公认在设计模式领域最具影响力的著作是Erich Gamma、Richard Helm、Ralph Johnson和和John Vlissides在在19941994年合作出版的著作:年合作出版的著作:Design PatternsDesign Patterns:Elements Elements of Reusable Object-Oriented Softwareof Reusable Object-Oriented Software(中译本(中译本设设计模式:可复用的面向对象软件的基本原理计模式:可复用的面向对象软件的基本原理 或或设计模设计模式
4、式),该书被广大喜爱者昵称为),该书被广大喜爱者昵称为GOFGOF(Gang of FourGang of Four)之)之书,被认为是学习设计模式的必读著作,书,被认为是学习设计模式的必读著作,GOFGOF之书已经被公之书已经被公认为是设计模式领域的奠基之作。认为是设计模式领域的奠基之作。1.4 学习设计模式的重要性学习设计模式的重要性 5/12/20225 学习设计模式不仅可以使我们使用好这些学习设计模式不仅可以使我们使用好这些成功的模式,更重要的是可以使我们更加深成功的模式,更重要的是可以使我们更加深刻地理解面向对象的设计思想,非常有利于刻地理解面向对象的设计思想,非常有利于我们更好地使
5、用面向对象语言解决设计中的我们更好地使用面向对象语言解决设计中的问题。问题。 1.5 合理使用模式合理使用模式 5/12/20226 1 1正确使用正确使用 2避免教条避免教条 3模式挖掘模式挖掘第二章第二章 面向对象的几个基本原则面向对象的几个基本原则 2.1 面向抽象原则面向抽象原则 5/12/20227 设计一个类时,不让该类面向具体的设计一个类时,不让该类面向具体的类,而是面向抽象类或接口类,而是面向抽象类或接口 。第二章第二章 面向对象的几个基本原则面向对象的几个基本原则 5/12/20228public class Circledouble r;Circle(double r)th
6、is.r=r;public double getArea()return 3.14*r*r;public class PillarCircle bottom; double height;Pillar(Circle bottom,double height)this.bottom=bottom;this.height=height;第二章第二章 面向对象的几个基本原则面向对象的几个基本原则 5/12/20229public abstract class Geometry public abstract double getArea();public class PillarGeometry b
7、ottom; double height;Pillar(Circle bottom,double height)this.bottom=bottom;this.height=height;2.2 开开- -闭原则闭原则 5/12/202210 设计应当对扩展开放,对修改关闭。设计应当对扩展开放,对修改关闭。 如果您的设计遵守了如果您的设计遵守了“开开- -闭原则闭原则”,那,那么这个设计一定是易维护的,因为在设计中么这个设计一定是易维护的,因为在设计中增加新的模块时,不必去修改设计中的核心增加新的模块时,不必去修改设计中的核心模块。模块。 2.3 高内聚高内聚- -低耦合原则低耦合原则 5/1
8、2/202211 如果类中的方法是一组相关的行为,则如果类中的方法是一组相关的行为,则称该类是称该类是高内聚高内聚的,反之称为低内聚的。的,反之称为低内聚的。 所谓所谓低耦合低耦合就是尽量不要让一个类含有就是尽量不要让一个类含有太多的其它类的实例的引用,以避免修改太多的其它类的实例的引用,以避免修改系统的其中一部分会影响到其它部分。系统的其中一部分会影响到其它部分。 第四章第四章 命令模式命令模式 5/12/202212命令模式(别名:动作,事务)命令模式(别名:动作,事务) 将一个请求封装为一个对象,从而使你可用不同的请将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求
9、排队或记录请求日志,以求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。及支持可撤消的操作。Command Pattern(Another Name: Action, Transaction) Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.一一 、 概述概述 5/12/202213 在许多设计中,经常涉及到一个对
10、象请求另一个对在许多设计中,经常涉及到一个对象请求另一个对象调用其方法到达某种目的。如果请求者不希望或无象调用其方法到达某种目的。如果请求者不希望或无法直接和被请求者打交道,即不希望或无法含有被请法直接和被请求者打交道,即不希望或无法含有被请求者的引用,那么就可以使用命令模式。求者的引用,那么就可以使用命令模式。 实例在军队作战中,指挥官请求三连偷袭敌人,但是指挥官不希望或无法直接与三连取得联系,那么可以将该请求:“三连偷袭敌人”形成一个“作战命令”。只要能让该作战命令被执行,就会实现三连偷袭敌人的目的。二、二、命令模式的结构与使用命令模式的结构与使用 5/12/202215模式的结构中包括四
11、种角色:模式的结构中包括四种角色: 接收者(接收者(ReceiverReceiver) 命令命令(Command)(Command)接口接口 具体命令(具体命令(ConcreteCommandConcreteCommand) 请求者(请求者(InvokerInvoker)5/12/202216模式的模式的UMLUML类图类图 5/12/202217模式的结构的描述与使用模式的结构的描述与使用 1 1接收者(接收者(ReceiverReceiver) : : CompanyArmy.javaCompanyArmy.javapublic class CompanyArmypublic class
12、CompanyArmy public void sneakAttack() public void sneakAttack() System.out.println( System.out.println(我们知道如何偷袭敌人我们知道如何偷袭敌人, ,保证完成任务保证完成任务); ); 5/12/202218模式的结构的描述与使用模式的结构的描述与使用 2 2命令(命令(CommandCommand)接口)接口 : : Command.javaCommand.javapublic interface Command public interface Command public abstrac
13、t void execute(); public abstract void execute(); 5/12/202219模式的结构的描述与使用模式的结构的描述与使用 3 3具体命令(具体命令(ConcreteCommandConcreteCommand) ConcreteCommand.java ConcreteCommand.java public class ConcreteCommand implements Commandpublic class ConcreteCommand implements Command CompanyArmy army; CompanyArmy army
14、; /含有接收者的引用含有接收者的引用 ConcreteCommand(CompanyArmy army)ConcreteCommand(CompanyArmy army) this.army=army; this.army=army; public void execute() public void execute() /封装着指挥官的请求封装着指挥官的请求 army.sneakAttack(); army.sneakAttack(); /偷袭敌人偷袭敌人 5/12/202220模式的结构的描述与使用模式的结构的描述与使用 4 4请求者(请求者(InvokerInvoker) ArmySu
15、perior.java ArmySuperior.java public class ArmySuperiorpublic class ArmySuperior Command command; Command command; /用来存放具体命令的引用用来存放具体命令的引用 public void setCommand(Command command)public void setCommand(Command command) mand=command; mand=command; public void startExecuteCommand() public void startExe
16、cuteCommand() /让具体命令执行让具体命令执行execute()execute()方法方法 command.execute();command.execute(); 5/12/202221模式的结构的描述与使用模式的结构的描述与使用 5 5应用应用 Application.javaApplication.java public class Application public class Application public static void main(String args) public static void main(String args) CompanyArmy
17、CompanyArmy 三连三连=new CompanyArmy(); =new CompanyArmy(); Command command=new ConcreteCommand( Command command=new ConcreteCommand(三连三连);); ArmySuperior ArmySuperior 指挥官指挥官=new ArmySuperior(); =new ArmySuperior(); 指挥官指挥官.setCommand(command); .setCommand(command); 指挥官指挥官.startExecuteCommand();.startExe
18、cuteCommand(); 三、三、命令模式的优点命令模式的优点 5/12/202222 在命令模式中,请求者(Invoker)不直接与接收者(Receiver)交互,即请求者(Invoker)不包含接收者(Receiver)的引用,因此彻底消除了彼此之间的耦合。 命令模式满足“开-闭原则”。如果增加新的具体命令和该命令的接受者,不必修改调用者的代码,调用者就可以使用新的命令对象;反之,如果增加新的调用者,不必修改现有的具体命令和接受者,新增加的调用者就可以使用已有的具体命令。四、应用举例 模拟带控制开关的小电器。该电器上有四个开关,两个一组,其中一组负责打开、关闭小电器上的照明灯,另一组负
19、责打开、关闭小电器上的摄像头。第五章第五章 观察者模式观察者模式 5/12/202224观察者模式(别名:依赖,发布观察者模式(别名:依赖,发布-订阅)订阅) 定义对象间的一种一对多的依赖关系,当一个对象的定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。自动更新。Observer Pattern(Another Name: Dependents, Publish-Subscribe) Define a one-to-many dependency between objects so tha
20、t when one object changes state, all its dependents are notified and updated automatically. 一一 、 概述概述 5/12/202225 在许多设计中,经常涉及到多个对象在许多设计中,经常涉及到多个对象都对一个特殊对象中的数据变化感兴趣,都对一个特殊对象中的数据变化感兴趣,而且这多个对象都希望跟踪那个特殊对而且这多个对象都希望跟踪那个特殊对象中的数据变化。象中的数据变化。 实例 某些寻找工作的人对“求职中心”的职业需求信息的变化非常关心,很想跟踪“求职中心”中职业需求信息的变化。“求职者”可以让“求职中心
21、”把自己登记下来,这样求职中心就会及时通知她最新的职业信息需求。二、二、 模式的结构与使用模式的结构与使用 5/12/202227观察者模式的结构中包括四种角色:观察者模式的结构中包括四种角色: 主题(主题(SubjectSubject) 观察者(观察者(ObserverObserver) 具体主题(具体主题(ConcreteSubjectConcreteSubject) 具体观察者(具体观察者(ConcreteObserverConcreteObserver) 5/12/202228模式的模式的UMLUML类图类图 5/12/202229模式的结构的描述与使用模式的结构的描述与使用 1 1主
22、题主题 : : Subject.java Subject.java public interface Subject public interface Subject public void addObserver(Observer o); public void addObserver(Observer o); public void deleteObserver(Observer o); public void deleteObserver(Observer o); public void notifyObservers(); public void notifyObservers();
23、5/12/202230模式的结构的描述与使用模式的结构的描述与使用 2 2观察者观察者 : : Obsever.java Obsever.java public interface Observerpublic interface Observer public void hearTelephone(String heardMess); public void hearTelephone(String heardMess); 5/12/202231模式的结构的描述与使用模式的结构的描述与使用 3 3具体主题具体主题 SeekJobCenter.java_1 SeekJobCenter.java
24、_1 import java.util.ArrayList; public class SeekJobCenter implements Subject String mess; boolean changed; ArrayList personList; SeekJobCenter() personList=new ArrayList(); mess=; changed=false; public void addObserver(Observer o) if(!(personList.contains(o) personList.add(o); public void deleteObse
25、rver(Observer o) if(personList.contains(o) personList.remove(o); 5/12/202232模式的结构的描述与使用模式的结构的描述与使用 3 3具体主题具体主题 SeekJobCenter.java_2 SeekJobCenter.java_2 public void notifyObservers() if(changed)for(int i=0;ipersonList.size();i+) Observer observer=personList.get(i); observer.hearTelephone(mess); chan
展开阅读全文