软件设计模式课件.ppt
《软件设计模式课件.ppt》由会员分享,可在线阅读,更多相关《软件设计模式课件.ppt(265页珍藏版)》请在三一办公上搜索。
1、封面,Java设计模式,耿祥义 张跃平 著,2022/12/18,1,清华大学出版社,第一章 设计模式简介,1.1 什么是设计模式,2022/12/18,2,每一个设计模式描述一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次一次地使用该方案而不必做重复劳动。,1.2 设计模式的起源,2022/12/18,3,软件领域的设计模式起源于建筑学。 1977年,建筑大师Alexander出版了A Pattern Language:Towns, Building, Construction一书。受Alexander著作的影响 ,Kent Beck和Ward Cunningh
2、am在1987年举行的一次面向对象的会议上发表了论文:在面向对象编程中使用模式。,1.3 GOF之著作,2022/12/18,4,目前,被公认在设计模式领域最具影响力的著作是Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides在1994年合作出版的著作:Design Patterns:Elements of Reusable Object-Oriented Software(中译本设计模式:可复用的面向对象软件的基本原理 或设计模式),该书被广大喜爱者昵称为GOF(Gang of Four)之书,被认为是学习设计模式的必读著作,GOF之书已
3、经被公认为是设计模式领域的奠基之作。,1.4 学习设计模式的重要性,2022/12/18,5,学习设计模式不仅可以使我们使用好这些成功的模式,更重要的是可以使我们更加深刻地理解面向对象的设计思想,非常有利于我们更好地使用面向对象语言解决设计中的问题。,1.5 合理使用模式,2022/12/18,6,1正确使用 2避免教条 3模式挖掘 4避免乱用 5了解反模式,第二章 面向对象的几个基本原则,2.1 面向抽象原则,2022/12/18,7,设计一个类时,不让该类面向具体的类,而是面向抽象类或接口 。,2.2 开-闭原则,2022/12/18,8,设计应当对扩展开放,对修改关闭。 如果您的设计遵守
4、了“开-闭原则”,那么这个设计一定是易维护的,因为在设计中增加新的模块时,不必去修改设计中的核心模块。,2.3 多用组合少用继承原则,2022/12/18,9,设计中避开类继承的缺点,充分使用对象组合的优点。,2.4 高内聚-低耦合原则,2022/12/18,10,如果类中的方法是一组相关的行为,则称该类是高内聚的,反之称为低内聚的。 所谓低耦合就是尽量不要让一个类含有太多的其它类的实例的引用,以避免修改系统的其中一部分会影响到其它部分。,第三章 UML类图简介,3.1 类(Class)_1,2022/12/18,11,在UML中,使用一个长方形描述一个类的主要构成,将长方形垂直地分为三层 。
5、 第1层是名字层,类名字是常规字形,表明该类是具体类,类名字是斜体字形,表明该类是抽象类。 第2层是变量层,也称属性层,列出类的成员变量及类型,格式是“变量名字:类型”。 第3层是方法层,也称操作层,列出类的方法及返回类型,格式是“方法名字(参数列表):类型”。,3.1 类(Class)_2,2022/12/18,12,Student,+name:String#age:int-money:double,+setName(String):void#printMess():void+getAge():intsetAge(int):void-getMoney();,名字层,变量层,方法层,3.2 接
6、口(Interface)_1,2022/12/18,13,表示接口的UML图和表示类的UML图类似,使用一个长方形描述一个接口的主要构成,将长方形垂直地分为三层 。 第1层是名字层,接口的名字必须是斜体字形,而且需要用修饰名字,并且该修饰和名字分列在2行。 第2层是常量层,列出接口中的常量及类型,格式是“常量名字:类型”。 第3层是方法层,也称操作层,列出接口中的方法及返回类型,格式是“方法名字(参数列表):类型”。,3.2 接口(Interface)_2,2022/12/18,14,Creator,+MAX:int,+factoryMethod():Product,名字层,常量层,方法层,3
7、.3 泛化关系(Generalization),2022/12/18,15,对于面向对象语言,UML中所说的泛化关系就是指类的继承关系。如果一个类是另一个类的子类,那么UML通过使用一个实线连接两个类的UML图来表示二者之间的继承关系,实线的起始端是子类的UML图,终点端是父类的UML图,但终点端使用一个空心的三角形表示实线的结束 。,3.4 关联关系(Association),2022/12/18,16,如果A类中成员变量是用B类(接口)来声明的变量,那么A和B的关系是关联关系,称A关联于B。那么UML通过使用一个实线连A和B的UML图,实线的起始端是A的UML图,终点端是B的UML图,但终
8、点端使用一个指向B的UML图的方向箭头表示实线的结束 。,3.5 依赖关系(Dependency),2022/12/18,17,如果A类中某个方法的参数用B类(接口)来声明的变量或某个方法返回的数据类型是B类型的,那么A和B的关系是依赖关系,称A依赖于B。那么UML通过使用一个虚线连A和B的UML图,虚线的起始端是A的UML图,终点端是B的UML图,但终点端使用一个指向B的UML图的方向箭头表示虚线的结束。,3.6 实现关系(Realization),2022/12/18,18,如果一个类实现了一个接口,那么类和接口的关系是实现关系,称类实现接口。UML通过使用虚线连接类和它所实现的接口,虚线
9、起始端是类,虚线的终点端是它实现的接口,但终点端使用一个空心的三角形表示虚线的结束 。,3.7 注释(Annotation),2022/12/18,19,UML使用注释为类图提供附加的说明。UML在一个带卷角的长方形中显示给出的注释,并使用虚线将这个带卷角的长方形和所它所注释的实体连接起来 。,第四章 命令模式,2022/12/18,20,命令模式(别名:动作,事务) 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。Command Pattern(Another Name: Action, Transaction) Encaps
10、ulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support undoable operations.,一 、 概述,2022/12/18,21,在许多设计中,经常涉及到一个对象请求另一个对象调用其方法到达某种目的。如果请求者不希望或无法直接和被请求者打交道,即不希望或无法含有被请求者的引用,那么就可以使用命令模式。,二、命令模式的结构与使用,2022/12/18,22,模式的结构中包括四种角色:
11、 接收者(Receiver) 命令(Command)接口 具体命令(ConcreteCommand) 请求者(Invoker),2022/12/18,23,模式的UML类图,2022/12/18,24,模式的结构的描述与使用,1接收者(Receiver) : CompanyArmy.javapublic class CompanyArmy public void sneakAttack() System.out.println(我们知道如何偷袭敌人,保证完成任务); ,2022/12/18,25,模式的结构的描述与使用,2命令(Command)接口 : Command.javapublic i
12、nterface Command public abstract void execute();,2022/12/18,26,模式的结构的描述与使用,3具体命令(ConcreteCommand) ConcreteCommand.java public class ConcreteCommand implements Command CompanyArmy army; /含有接收者的引用 ConcreteCommand(CompanyArmy army) this.army=army; public void execute() /封装着指挥官的请求 army.sneakAttack(); /偷
13、袭敌人 ,2022/12/18,27,模式的结构的描述与使用,4请求者(Invoker) ArmySuperior.java public class ArmySuperior Command command; /用来存放具体命令的引用 public void setCommand(Command command) mand=command; public void startExecuteCommand() /让具体命令执行execute()方法 command.execute(); ,2022/12/18,28,模式的结构的描述与使用,5应用 Application.java public
14、 class Application public static void main(String args) CompanyArmy 三连=new CompanyArmy(); Command command=new ConcreteCommand(三连); ArmySuperior 指挥官=new ArmySuperior(); 指挥官.setCommand(command); 指挥官.startExecuteCommand(); ,三、命令模式的优点,2022/12/18,29,在命令模式中,请求者(Invoker)不直接与接收者(Receiver)交互,即请求者(Invoker)不包含
15、接收者(Receiver)的引用,因此彻底消除了彼此之间的耦合。 命令模式满足“开-闭原则”。如果增加新的具体命令和该命令的接受者,不必修改调用者的代码,调用者就可以使用新的命令对象;反之,如果增加新的调用者,不必修改现有的具体命令和接受者,新增加的调用者就可以使用已有的具体命令。 由于请求者的请求被封装到了具体命令中,那么就可以将具体命令保存到持久化的媒介中,在需要的时候,重新执行这个具体命令。因此,使用命令模式可以记录日志。 使用命令模式可以对请求者的“请求”进行排队。每个请求都各自对应一个具体命令,因此可以按一定顺序执行这些具体命令。,第五章 观察者模式,2022/12/18,30,观察
16、者模式(别名:依赖,发布-订阅) 定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。Observer Pattern(Another Name: Dependents, Publish-Subscribe) Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.,一 、 概述,2022/12/18,31,在许
17、多设计中,经常涉及到多个对象都对一个特殊对象中的数据变化感兴趣,而且这多个对象都希望跟踪那个特殊对象中的数据变化。,二、 模式的结构与使用,2022/12/18,32,观察者模式的结构中包括四种角色: 主题(Subject) 观察者(Observer) 具体主题(ConcreteSubject) 具体观察者(ConcreteObserver),2022/12/18,33,模式的UML类图,2022/12/18,34,模式的结构的描述与使用,1主题 : Subject.java public interface Subject public void addObserver(Observer o
18、); public void deleteObserver(Observer o); public void notifyObservers();,2022/12/18,35,模式的结构的描述与使用,2观察者 : Obsever.java public interface Observer public void hearTelephone(String heardMess);,2022/12/18,36,模式的结构的描述与使用,3具体主题 SeekJobCenter.java_1 import java.util.ArrayList; public class SeekJobCenter i
19、mplements 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 deleteObserver(Observer o) if(personList.contains(o) personList.remov
20、e(o); ,2022/12/18,37,模式的结构的描述与使用,3具体主题 SeekJobCenter.java_2 public void notifyObservers() if(changed)for(int i=0;ipersonList.size();i+) Observer observer=personList.get(i); observer.hearTelephone(mess); changed=false; public void giveNewMess(String str) if(str.equals(mess) changed=false; else mess=s
21、tr; changed=true; ,2022/12/18,38,模式的结构的描述与使用,4具体观察者_1 UniversityStudent.javaimport java.io.*;public class UniverStudent implements Observer Subject subject; File myFile; UniverStudent(Subject subject,String fileName) this.subject=subject; subject.addObserver(this); /使当前实例成为subject所引用的具体主题的观察者 myFile
22、=new File(fileName); public void hearTelephone(String heardMess) try RandomAccessFile out=new RandomAccessFile(myFile,rw); out.seek(out.length(); byte b=heardMess.getBytes(); out.write(b); /更新文件中的内容 System.out.print(我是一个大学生,); System.out.println(我向文件+myFile.getName()+写入如下内容:); System.out.println(hea
23、rdMess); catch(IOException exp) System.out.println(exp.toString(); ,2022/12/18,39,模式的结构的描述与使用,4具体观察者_2 HaiGui.java import java.io.*;import java.util.regex.*;public class HaiGui implements Observer Subject subject; File myFile; HaiGui(Subject subject,String fileName) this.subject=subject; subject.add
24、Observer(this); /使当前实例成为subject所引用的具体主题的观察者 myFile=new File(fileName); public void hearTelephone(String heardMess) try boolean boo=heardMess.contains(java程序员)|heardMess.contains(软件); if(boo) RandomAccessFile out=new RandomAccessFile(myFile,rw); out.seek(out.length(); byte b=heardMess.getBytes(); out
25、.write(b); System.out.print(我是一个海归,); System.out.println(我向文件+myFile.getName()+写入如下内容:); System.out.println(heardMess); else System.out.println(我是海归,这次的信息中没有我需要的信息); catch(IOException exp) System.out.println(exp.toString(); ,2022/12/18,40,模式的结构的描述与使用,5应用 Application.javapublic class Application publ
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件设计 模式 课件
链接地址:https://www.31ppt.com/p-1786874.html