版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、封面Java设计模式设计模式 耿祥义耿祥义 张跃平张跃平 著著 2022-6-281清华大学出版社清华大学出版社 设计模式的诞生与发展 模式的诞生与定义 模式起源于建筑业而非软件业 模式(Pattern)之父美国加利佛尼亚大学环境结构中心研究所所长Christopher Alexander博士 A Pattern Language: Towns, Buildings, Construction253个建筑和城市规划模式 模式 Context(模式可适用的前提条件) Theme或Problem(在特定条件下要解决的目标问题) Solution(对目标问题求解过程中各种物理关系的记述)设计模式的诞
2、生与发展Christopher Alexander设计模式的诞生与发展w 模式的诞生与定义 Alexander给出了关于模式的经典定义:每给出了关于模式的经典定义:每个模式都描述了一个个模式都描述了一个在我们的环境中不断出在我们的环境中不断出现的问题现的问题,然后描述了该问题的,然后描述了该问题的解决方案解决方案的的核心,通过这种方式,我们可以无数次地重核心,通过这种方式,我们可以无数次地重用那些已有的解决方案,无需再重复相同的用那些已有的解决方案,无需再重复相同的工作。工作。 模式是在模式是在特定环境特定环境中中解决问题解决问题的一种的一种方案方案 设计模式的诞生与发展w 软件模式 1990
3、年,软件工程界开始关注年,软件工程界开始关注Christopher Alexander等在这一住宅、公共建筑与城市规划领等在这一住宅、公共建筑与城市规划领域的重大突破,最早将该模式的思想引入软件工程域的重大突破,最早将该模式的思想引入软件工程方法学的是方法学的是1991-1992年以年以“四人组四人组(Gang of Four,GoF,分别是,分别是Erich Gamma, Richard Helm, Ralph Johnson和和John Vlissides)”自称的自称的四位著名软件工程学者,他们在四位著名软件工程学者,他们在1994年归纳发表了年归纳发表了23种在软件开发中使用频率较高的
4、设计模式,旨在种在软件开发中使用频率较高的设计模式,旨在用模式来统一沟通面向对象方法在分析、设计和实用模式来统一沟通面向对象方法在分析、设计和实现间的鸿沟现间的鸿沟。设计模式的诞生与发展设计模式的诞生与发展设计模式的发展 1987年,Kent Beck和Ward Cunningham借鉴Alexander的模式思想在程序开发中开始应用一些模式 ,在OOPSLA会议上发表了他们的成果。 1990年,OOPSLA与ECOOP联合举办,Erich Gamma和Richard Helm等人开始讨论有关模式的话题(Bruce Anderson主持),“四人组” 正式成立,并开始着手进行设计模式的分类整理
5、工作。 1991 年,OOPSLA,Bruce Anderson主持了首次针对设计模式的研讨会 。 1992 年,OOPSLA ,Anderson再度主持研讨会,模式已经逐渐成为人们讨论的话题。 注: OOPSLA (Object-Oriented Programming, Systems, Languages & Applications,面向对象编程、系统、语言和应用大会),编程语言及软件工程国际顶级会议,2010年改为SPLASH - Systems, Programming, Languages and Applications: Software for Humanity 设
6、计模式的诞生与发展 设计模式的发展 1993年,Kent Beck 和 Grady Booch 赞助了第一次关于设计模式的会议,这个设计模式研究组织发展成为著名的Hillside Group研究组。 1994 年,由Hillside Group发起,在美国伊利诺伊州(Illinois)的Allerton Park召开了第1届关于面向对象模式的世界性会议,名为PLoP(Pattern Languages of Programs, 编程语言模式会议),简称PLoP94。 1995年,PLoP95 仍在伊利诺伊州的Allerton Park举行 ,“四人组”出版了设计模式:可复用面向对象软件的基础(
7、Design Patterns: Elements of Reusable Object-Oriented Software)一书,本书成为1995年最抢手的面向对象书籍,也成为设计模式的经典书籍。 设计模式的诞生与发展 设计模式的发展 从1995年至今,设计模式在软件开发中得以广泛应用,在Sun的Java SE/Java EE平台和Microsoft的.net平台设计中就应用了大量的设计模式。 诞生了越来越多的与设计模式相关的书籍和网站,设计模式也作为一门独立的课程或作为软件体系结构等课程的重要组成部分出现在国内外研究生和大学教育的课堂上。设计模式的定义与分类 设计模式的定义 设计模式(De
8、sign Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式的定义与分类 设计模式的基本要素 设计模式一般有如下几个基本要素:模式名称、问题、目的、解决方案、效果、实例代码和相关设计模式,其中的关键元素包括以下四个方面:模式名称 (Pattern name) 问题 (Problem) 解决方案 (Solution) 效果 (Consequences) 设计模式的定义与分类 设计模式的分类根据其目的(模式是用来做什么的)可分为创建型(Creational),结构型(Structural
9、)和行为型(Behavioral)三种: 创建型模式主要用于创建对象。 结构型模式主要用于处理类或对象的组合。 行为型模式主要用于描述对类或对象怎样交互和怎样分配职责。GoF设计模式简介 w创建型模式抽象工厂模式抽象工厂模式(Abstract Factory)建造者模式建造者模式(Builder)工厂方法模式工厂方法模式(Factory Method)原型模式原型模式(Prototype)单例模式单例模式(Singleton) GoF设计模式简介 w 结构型模式适配器模式适配器模式(Adapter)桥接模式桥接模式(Bridge)组合模式组合模式(Composite)装饰模式装饰模式(Deco
10、rator)外观模式外观模式(Facade)享元模式享元模式(Flyweight)代理模式代理模式(Proxy)GoF设计模式简介 w行为型模式职责链模式职责链模式(Chain of Responsibility)命令模式命令模式(Command)解释器模式解释器模式(Interpreter)迭代器模式迭代器模式(Iterator)中介者模式中介者模式(Mediator)备忘录模式备忘录模式(Memento)观察者模式观察者模式(Observer)状态模式状态模式(State)策略模式策略模式(Strategy)模板方法模式模板方法模式(Template Method)访问者模式访问者模式(V
11、isitor)设计模式的优点 设计模式是从许多优秀的软件系统中总结出的成功的、能够实现可维护性复用的设计方案,使用这些方案将避免我们做一些重复性的工作,而且可以设计出高质量的软件系统。 设计模式的主要优点如下: 设计模式融合了众多专家的经验,并以一种标准的形式供广大开发人员所用,它提供了一套通用的设计词汇和一种通用的语言以方便开发人员之间沟通和交流,使得设计方案更加通俗易懂。对于使用不同编程语言的开发和设计人员可以通过设计模式来交流系统设计方案,每一个模式都对应一个标准的解决方案,设计模式可以降低开发人员理解系统的复杂度。设计模式的优点 设计模式使人们可以更加简单方便地复用成功的设计和体系结构
12、,将已证实的技术表述成设计模式也会使新系统开发者更加容易理解其设计思路。设计模式使得重用成功的设计更加容易,并避免那些导致不可重用的设计方案。 设计模式使得设计方案更加灵活,且易于修改。 设计模式的使用将提高软件系统的开发效率和软件质量,且在一定程度上节约设计成本。 设计模式有助于初学者更深入地理解面向对象思想,一方面可以帮助初学者更加方便地阅读和学习现有类库与其他系统中的源代码,另一方面还可以提高软件的设计水平和代码质量。第二章第二章 面向对象的几个基本原则面向对象的几个基本原则 2022-6-2818面向对象的三大特征 封装:隐藏内部实现,保护内部信息,提供一种公共的访问方式 继承:实现复
13、用,归纳共性 多态:对象在不同的时刻可以表现出不同的状态问题:是不是在设计程序时类的结构中使用到了封装、继承、多态就是面向对象?真正的面向对象 体现出三大特性:封装、继承、多态 遵循面向对象的基本设计原则 正确使用设计模式 实现软件系统可扩展性好、可复用性好、灵活性好、维护性好的目的。面向对象的基本原则简介中文名称中文名称英文名称英文名称提出者提出者单一职责原则Single responsibility principleRobert C. Martin开-闭原则Open-Closed PrincipleBertrand Meyer里氏替换原则Liskov Substitution Princ
14、ipleBarbara Liskov接口分离原则Interface Segregation PrincipleRobert C. Martin依赖倒置原则Dependency Inversion PrincipleRobert C. Martin第二章第二章 面向对象的几个基本原则面向对象的几个基本原则 面向抽象原则面向抽象原则 2022-6-2822 设计一个类时,不让该类面向具体的设计一个类时,不让该类面向具体的类,而是面向抽象类或接口类,而是面向抽象类或接口 。23 面向抽象原则- 抽象类特点 抽象类中可以有抽象方法,也可以有非抽象方法 抽象类不能用new运算符创建对象 如果一个子类继承
15、一个抽象类,该子类要么实现父类的所有抽象方法,要么该子类也声明为抽象类。 可以作为上转型对象。24面向抽象原则 - 抽象类示例abstract class Apublic abstract int add(int a, int b);class B extends Apublic int add(int a, int b)return a+b;public class Applicationpublic static void main(String args)A a = new B();int m = a.add(3,2);System.out.println(m);25面向抽象原则- 接口
16、特点 接口中只可以有public权限的抽象方法,不可以有非抽象方法 接口中的成员变量都默认是共有的和终结类型的 接口不能用new创建对象,必须用类去实现 接口的回调:在接口类型的变量中可以存储实现该接口的类实例的引用,并通过该接口变量来访问类实例的方法。26面向抽象原则- 接口示例interface Compublic abstract int sub(int x, int y);class ComImp implements Compublic int sub(int x, int y)return x y;public class Applicationpublic static void
17、 main(String args)Com com = new ComImp();int m = com.sub(8,2);System.out.println(m);27面向抽象原则- 面向抽象 指当设计类时,不让该类面向具体的类,而是面向抽象类或接口,即所设计类中重要数据是抽象类或接口的变量,而不是具体类的变量。28面向抽象原则- 面向抽象示例public class Circle double r; public Circle(double r) this.r =r; public double getArea() return Math.PI*r*r; public class Pil
18、lar Circle bottom; double height29面向抽象原则- 面向抽象示例改进30面向抽象原则- 面向抽象示例改进开-闭原则(OCP) 核心思想: 对扩展开放:有新的需求或变化时,可以对现有代码进行扩展,以适应新情况。 对修改关闭:类一旦设计完成,就可以独立完成自己的工作,而不要再对类进行任何修改。 实现方式:抽象,多态,继承,接口软件应该是可扩展,而不可修改的。软件应该是可扩展,而不可修改的。 对扩展开放,对修改关闭。对扩展开放,对修改关闭。 32开-闭原则 如果遵守了如果遵守了“开开-闭原则闭原则”,那么这,那么这个设计一定是易维护的,因为在设计个设计一定是易维护的,
19、因为在设计中增加新的模块时,不必去修改设计中增加新的模块时,不必去修改设计中的核心模块。中的核心模块。 OCP的动机很简单:软件是变化的。不论是的动机很简单:软件是变化的。不论是优质的设计还是低劣的设计都无法回避这一问优质的设计还是低劣的设计都无法回避这一问题。题。OCP说明了软件设计应该尽可能地使架构说明了软件设计应该尽可能地使架构稳定而又容易满足不同的需求稳定而又容易满足不同的需求 实例分析 Console.Write(请输入数字请输入数字A:);string A = Console.ReadLine();Console.Write(请选择运算符号请选择运算符号(+、-、*、/):);st
20、ring B = Console.ReadLine();Console.Write(请输入数字请输入数字B:);string C = Console.ReadLine();string D = ;if (B = +) D = Convert.ToString(Convert.ToDouble(A) + Convert.ToDouble(C);if (B = -) D = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(C);if (B = *) D = Convert.ToString(Convert.ToDouble(A) *
21、Convert.ToDouble(C);if (B = /) D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(C);Console.WriteLine(结果是:结果是: + D);要加运算,怎么办?要加运算,怎么办? 实例分析 先不论程序的健壮性,如果客户要求增加求余运算,该如何处理?增加判断,增加分支增加判断,增加分支 客户类改进后客户类开闭原则小结开闭原则适用于那些需求会经常发生变化的系统,应该努力使大部分模块满足开闭原则。开闭原则是面向对象设计的核心,满足该原则可以达到最大限度的复用和可维护性。组合优先于继承 (1)
22、什么是继承? 它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 (2)什么是组合? 通过创建一个由其他对象组合的对象来获得新功能的重用方法,新功能的获得是通过调用组合对象的功能实现的,有时又叫聚合。 (3)继承与组合 继承与子类之间是“Is-a”的关系 组合与其它类之间是“Has-a”的关系继承的优缺点 继承的优缺点 优点:1.新的实现很容易,因为大部分是继承而来的 2.很容易修改和扩展已有的实现 缺点:1.打破了封装,因为基类向子类暴露了实现细节 2.白盒重用,因为基类的内部细节通常对子类是可见的 3.当父类的实现改变时可能要相应的对子类做出改变 4.不能在运
23、行时改变由父类继承来的实现组合的优缺点 组合的优缺点 优点:1. 被包含对象通过包含他们的类来访问 2. 黑盒重用,因为被包含对象的内部细节是不可见的 3. 很好的封装 4. 每个类专注于一个任务 5. 通过获得和被包含对象的类型相同的对象引用,可以在运行时动态定义组合的方式 缺点:1.结果系统可能会包含更多的对象 2.为了使组合时可以使用不同的对象,必须小心的 定义接口组合比继承具有更大的灵活性和更稳定的结构组合比继承具有更大的灵活性和更稳定的结构 组合优先于继承 实例:有一个叫做HuntBird的游戏,里面需要表示各种各样的鸟类。组合优先于继承 最初的设计组合优先于继承需求变化:鸟类要会飞
24、组合优先于继承 如果增加一种鸟类“企鹅”呢?组合优先于继承 改进方法:对“飞”使用多态组合优先于继承 改进方法:再次使用继承组合优先于继承 如果增加“游泳”行为呢?组合优先于继承组合优先于继承 使用“组合”思路考虑问题 “汽车”拥有某种或某些“用途” “汽车”和“用途”独立变化,互不影响组合优先于继承 什么时候使用继承? 子类是超类的一个特殊种类,而不是超类的一个角色,也就是要区分“Has-A”与“Is-A”的不同。 子类具有扩展超类的责任,而不是具有置换掉(Override)或注销超类的责任。 只有在分类学角度上有意义时,才可以使用继承。50高内聚-低耦合原则 高内聚高内聚 如果类中的方法是
25、一组相关的行为,则称该类是如果类中的方法是一组相关的行为,则称该类是高内聚高内聚的,反之称为低内聚的。的,反之称为低内聚的。 低耦合低耦合 所谓所谓低耦合低耦合就是尽量不要让一个类含有太多的其就是尽量不要让一个类含有太多的其它类的实例的引用,以避免修改系统的其中一部它类的实例的引用,以避免修改系统的其中一部分会影响到其它部分。分会影响到其它部分。高内聚低耦合哪种耦合度低?什么是单一职责原则单一职责原则(Single Responsibility Principle ): 就一个类而言,应该仅有一个引起它变化的原因。多功能的山寨手机山寨手机的功能: 拍照、摄像、手机游戏、网络摄像头、GPS、炒股
26、等等。功能多、但是每一个功能都不强。拍摄功能 -专业摄像机或照相机手机游戏 -PSP网络摄像头-专业摄像头GPS功能-专业GPS导航系统烦人的山寨手机 每一个职责都是一个变化的轴线,当需求变化时会反映为类的职责的变化。如果一个类承担的职责多于一个,那么引起它变化的原因就有多个。一个职责的变化甚至可能会削弱或者抑制类完成其他职责的能力,从而导致脆弱的设计。单一职责原则示例接受客户端输入并提交到数据库。原有设计: 一个类负责接受客户端输入,对客户端输入进行校验,连接数据库,并提交数据到数据库。现有设计: 一个功能也就是一个职责由一个类来负责。单一职责原则(SRP) (1)目的:如果你有多个原因去改
27、变一个类,那么应该把这些引起变化的原因分离开,把这个类分成多个类,每个类只负责处理一种改变。当你做出某种改变时,只需要修改负责处理该改变的类。 (2)单一职责原则 一个类应该只受一种变化的影响。 如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭到意想不到的破坏。一个类,应该仅有一个引起它变化的原因一个类,应该仅有一个引起它变化的原因 单一职责原则(SRP) (3)好处: 类的复杂性降低,实现什么职责都有清晰明确的定义。 可读性提高。 可维护性提高。 变更引起的风险降低。第三章第三章
28、UMLUML类图简介类图简介 3.1 类类(Class)_1 (Class)_1 2022-6-2858 在在UMLUML中,使用一个长方形描述一个类的主要构成,将长中,使用一个长方形描述一个类的主要构成,将长方形垂直地分为三层方形垂直地分为三层 。 第第1 1层层是名字层,类名字是常规字形,表明该类是具体类,是名字层,类名字是常规字形,表明该类是具体类,类名字是斜体字形,表明该类是抽象类。类名字是斜体字形,表明该类是抽象类。 第第2 2层层是变量层,也称属性层,列出类的成员变量及类型,是变量层,也称属性层,列出类的成员变量及类型,格式是格式是“变量名字:类型变量名字:类型”。 第第3 3层层
29、是方法层,也称操作层,列出类的方法及返回类型,是方法层,也称操作层,列出类的方法及返回类型,格式是格式是“方法名字(参数列表):类型方法名字(参数列表):类型”。 3.1 类类(Class)_2 (Class)_2 2022-6-2859Student+name:String#age:int-money:double+setName(String):void#printMess():void+getAge():intsetAge(int):void-getMoney();名字层名字层 变量层变量层 方法层方法层 +#-protected的的private的的友好的友好的的的public的的变量
30、变量或或方法方法的访问权限是的访问权限是名字名字前加前加3.2 接口(接口(InterfaceInterface)_1 _1 2022-6-2860 表示接口的表示接口的UMLUML图和表示类的图和表示类的UMLUML图类似,使用一个长方形图类似,使用一个长方形描述一个接口的主要构成,将长方形垂直地分为三层描述一个接口的主要构成,将长方形垂直地分为三层 。 第第1 1层层是名字层,接口的名字必须是斜体字形,而且需要用是名字层,接口的名字必须是斜体字形,而且需要用修饰名字,并且该修饰和名字分列在修饰名字,并且该修饰和名字分列在2 2行。行。 第第2层层是常量层,列出接口中的常量及类型,格式是是常
31、量层,列出接口中的常量及类型,格式是“常常量名字:类型量名字:类型”。 第第3层层是方法层,也称操作层,列出接口中的方法及返回是方法层,也称操作层,列出接口中的方法及返回类型,格式是类型,格式是“方法名字(参数列表):类型方法名字(参数列表):类型”。 3.2 接口(接口(Interface)_2 Interface)_2 2022-6-2861Creator +MAX:int +factoryMethod():Product 名字层名字层 常量层常量层 方法层方法层 +public的的常量常量或或方法方法的访问权限是的访问权限是名字名字前加前加3.3 泛化关系(泛化关系(Generaliza
32、tionGeneralization) 2022-6-2862 对于面向对象语言,对于面向对象语言,UMLUML中中所说的所说的泛化关系就是指类的继泛化关系就是指类的继承关系承关系。如果一个类是另一个。如果一个类是另一个类的子类,那么类的子类,那么UMLUML通过使用通过使用一个实线连接两个类的一个实线连接两个类的UMLUML图图来表示二者之间的继承关系,来表示二者之间的继承关系,实线的起始端是子类的实线的起始端是子类的UMLUML图,图,终点端是父类的终点端是父类的UMLUML图,但终图,但终点端使用一个空心的三角形表点端使用一个空心的三角形表示实线的结束示实线的结束 。 3.4 关联关系(
33、关联关系(AssociationAssociation)2022-6-2863 如果如果A A类中成员变量是用类中成员变量是用B B类(接口)来声明的变量,类(接口)来声明的变量,那么那么A A和和B B的关系是关联关系,称的关系是关联关系,称A A关联于关联于B B。那么。那么UMLUML通过通过使用一个实线连使用一个实线连A A和和B B的的UMLUML图,实线的起始端是图,实线的起始端是A A的的UMLUML图,图,终点端是终点端是B B的的UMLUML图,但终点端使用一个指向图,但终点端使用一个指向B B的的UMLUML图的方图的方向箭头表示实线的结束向箭头表示实线的结束 。 3.5
34、依赖关系(依赖关系(DependencyDependency) 2022-6-2864 如果如果A A类中某个方法的参数用类中某个方法的参数用B B类(接口)来声明的变类(接口)来声明的变量或某个方法返回的数据类型是量或某个方法返回的数据类型是B B类型的,那么类型的,那么A A和和B B的关的关系是依赖关系,称系是依赖关系,称A A依赖于依赖于B B。那么那么UMLUML通过使用一个虚线通过使用一个虚线连连A A和和B B的的UMLUML图,虚线的起始端是图,虚线的起始端是A A的的UMLUML图,终点端是图,终点端是B B的的UMLUML图,但终点端使用一个指向图,但终点端使用一个指向B
35、B的的UMLUML图的方向箭头表示图的方向箭头表示虚线的结束。虚线的结束。 3.6 实现关系(实现关系(RealizationRealization) 2022-6-2865 如果一个类实现了一个如果一个类实现了一个接口,那么类和接口的关系接口,那么类和接口的关系是实现关系,称类实现接口。是实现关系,称类实现接口。UMLUML通过使用虚线连接类和通过使用虚线连接类和它所实现的接口,虚线起始它所实现的接口,虚线起始端是类,虚线的终点端是它端是类,虚线的终点端是它实现的接口,但终点端使用实现的接口,但终点端使用一个空心的三角形表示虚线一个空心的三角形表示虚线的结束的结束 。3.7 注释(注释(An
36、notationAnnotation) 2022-6-2866 UML UML使用注释为类图提供附加的说明。使用注释为类图提供附加的说明。UMLUML在一个带卷角的在一个带卷角的长方形中显示给出的注释,并使用虚线将这个带卷角的长方形长方形中显示给出的注释,并使用虚线将这个带卷角的长方形和所它所注释的实体连接起来和所它所注释的实体连接起来 。第四章第四章 命令模式命令模式 2022-6-2867命令模式(别名:动作,事务)命令模式(别名:动作,事务) 将一个请求封装为一个对象,从而使你可用不同的请将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以求对客
37、户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。及支持可撤消的操作。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.一一 、 概述概述 2022-6-2868 在许多设计中,经常涉及到一个对象请求另一个对在许多设计中,
38、经常涉及到一个对象请求另一个对象调用其方法到达某种目的。如果请求者不希望或无象调用其方法到达某种目的。如果请求者不希望或无法直接和被请求者打交道,即不希望或无法含有被请法直接和被请求者打交道,即不希望或无法含有被请求者的引用,那么就可以使用命令模式。求者的引用,那么就可以使用命令模式。 二、二、命令模式的结构与使用命令模式的结构与使用 2022-6-2869模式的结构中包括四种角色:模式的结构中包括四种角色: 接收者(接收者(ReceiverReceiver) 命令命令(Command)(Command)接口接口 具体命令(具体命令(ConcreteCommandConcreteCommand
39、) 请求者(请求者(InvokerInvoker)2022-6-2870模式的模式的UMLUML类图类图 2022-6-2871模式的结构的描述与使用模式的结构的描述与使用 1 1接收者(接收者(ReceiverReceiver) : : CompanyArmy.javaCompanyArmy.javapublic class CompanyArmypublic class CompanyArmy public void sneakAttack() public void sneakAttack() System.out.println( System.out.println(我们知道如何偷袭
40、敌人我们知道如何偷袭敌人, ,保证完成任务保证完成任务); ); 2022-6-2872模式的结构的描述与使用模式的结构的描述与使用 2 2命令(命令(CommandCommand)接口)接口 : : Command.javaCommand.javapublic interface Command public interface Command public abstract void execute(); public abstract void execute(); 2022-6-2873模式的结构的描述与使用模式的结构的描述与使用 3 3具体命令(具体命令(ConcreteComman
41、dConcreteCommand) ConcreteCommand.java ConcreteCommand.java public class ConcreteCommand implements Commandpublic class ConcreteCommand implements Command CompanyArmy army; CompanyArmy army; /含有接收者的引用含有接收者的引用 ConcreteCommand(CompanyArmy army)ConcreteCommand(CompanyArmy army) this.army=army; this.arm
42、y=army; public void execute() public void execute() /封装着指挥官的请求封装着指挥官的请求 army.sneakAttack(); army.sneakAttack(); /偷袭敌人偷袭敌人 2022-6-2874模式的结构的描述与使用模式的结构的描述与使用 4 4请求者(请求者(InvokerInvoker) ArmySuperior.java ArmySuperior.java public class ArmySuperiorpublic class ArmySuperior Command command; Command comma
43、nd; /用来存放具体命令的引用用来存放具体命令的引用 public void setCommand(Command command)public void setCommand(Command command) mand=command; mand=command; public void startExecuteCommand() public void startExecuteCommand() /让具体命令执行让具体命令执行execute()execute()方法方法 command.execute();command.execute(); 2022-6-2875模式的结构的描述与使用
44、模式的结构的描述与使用 5 5应用应用 Application.javaApplication.java public class Application public class Application public static void main(String args) public static void main(String args) CompanyArmy CompanyArmy 三连三连=new CompanyArmy(); =new CompanyArmy(); Command command=new ConcreteCommand( Command command=ne
45、w ConcreteCommand(三连三连);); ArmySuperior ArmySuperior 指挥官指挥官=new ArmySuperior(); =new ArmySuperior(); 指挥官指挥官.setCommand(command); .setCommand(command); 指挥官指挥官.startExecuteCommand();.startExecuteCommand(); 三、三、命令模式的优点命令模式的优点 2022-6-2876 在命令模式中,请求者(Invoker)不直接与接收者(Receiver)交互,即请求者(Invoker)不包含接收者(Receiv
46、er)的引用,因此彻底消除了彼此之间的耦合。 命令模式满足“开-闭原则”。如果增加新的具体命令和该命令的接受者,不必修改调用者的代码,调用者就可以使用新的命令对象;反之,如果增加新的调用者,不必修改现有的具体命令和接受者,新增加的调用者就可以使用已有的具体命令。 由于请求者的请求被封装到了具体命令中,那么就可以将具体命令保存到持久化的媒介中,在需要的时候,重新执行这个具体命令。因此,使用命令模式可以记录日志。 使用命令模式可以对请求者的“请求”进行排队。每个请求都各自对应一个具体命令,因此可以按一定顺序执行这些具体命令。第五章第五章 观察者模式观察者模式 2022-6-2877观察者模式(别名
47、:依赖,发布观察者模式(别名:依赖,发布-订阅)订阅) 定义对象间的一种一对多的依赖关系,当一个对象的定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。自动更新。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
48、are notified and updated automatically. 一一 、 概述概述 2022-6-2878 在许多设计中,经常涉及到多个对象在许多设计中,经常涉及到多个对象都对一个特殊对象中的数据变化感兴趣,都对一个特殊对象中的数据变化感兴趣,而且这多个对象都希望跟踪那个特殊对而且这多个对象都希望跟踪那个特殊对象中的数据变化。象中的数据变化。 二、二、 模式的结构与使用模式的结构与使用 2022-6-2879观察者模式的结构中包括四种角色:观察者模式的结构中包括四种角色: 主题(主题(SubjectSubject) 观察者(观察者(ObserverObserver) 具体主题(
49、具体主题(ConcreteSubjectConcreteSubject) 具体观察者(具体观察者(ConcreteObserverConcreteObserver) 2022-6-2880模式的模式的UMLUML类图类图 2022-6-2881模式的结构的描述与使用模式的结构的描述与使用 1 1主题主题 : : Subject.java Subject.java public interface Subject public interface Subject public void addObserver(Observer o); public void addObserver(Observ
50、er o); public void deleteObserver(Observer o); public void deleteObserver(Observer o); public void notifyObservers(); public void notifyObservers(); 2022-6-2882模式的结构的描述与使用模式的结构的描述与使用 2 2观察者观察者 : : Obsever.java Obsever.java public interface Observerpublic interface Observer public void hearTelephone(
51、String heardMess); public void hearTelephone(String heardMess); 2022-6-2883模式的结构的描述与使用模式的结构的描述与使用 3 3具体主题具体主题 SeekJobCenter.java_1 SeekJobCenter.java_1 import java.util.ArrayList; public class SeekJobCenter implements Subject String mess; boolean changed; ArrayList personList; SeekJobCenter() person
52、List=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.remove(o); 2022-6-2884模式的结构的描述与使用模式的结构的描述与使用 3 3具体主题具体主题 SeekJobCenter.java_2 SeekJobCenter.java_
53、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=str; changed=true; 2022-6-2885模式的结构的描述与使用模式的结构的描述与使用 4 4具体观
54、察者具体观察者_1 _1 UniversityStudent.javaUniversityStudent.javaimport java.io.import java.io.* *; ;public class UniverStudent implements Observerpublic class UniverStudent implements Observer Subject subject; Subject subject; File myFile; File myFile; UniverStudent(Subject subject,String fileName) UniverS
55、tudent(Subject subject,String fileName) this.subject=subject; this.subject=subject; subject.addObserver(this); / subject.addObserver(this); /使当前实例成为使当前实例成为subjectsubject所引用的具体主题的观察者所引用的具体主题的观察者 myFile=new File(fileName);myFile=new File(fileName); public void hearTelephone(String heardMess) public vo
56、id hearTelephone(String heardMess) try RandomAccessFile out=new RandomAccessFile(myFile,rw); try RandomAccessFile out=new RandomAccessFile(myFile,rw); out.seek(out.length(); out.seek(out.length(); byte b=heardMess.getBytes(); byte b=heardMess.getBytes(); out.write(b); / out.write(b); /更新文件中的内容更新文件中的
57、内容 System.out.print(System.out.print(我是一个大学生我是一个大学生,); ,); System.out.println( System.out.println(我向文件我向文件+myFile.getName()+myFile.getName()+写入如下内容写入如下内容:);:); System.out.println(heardMess); System.out.println(heardMess); catch(IOException exp) catch(IOException exp) System.out.println(exp.toString(
58、); System.out.println(exp.toString(); 2022-6-2886模式的结构的描述与使用模式的结构的描述与使用 4 4具体观察者具体观察者_2 _2 HaiGui.javaHaiGui.java import java.io.import java.io.* *; ;import java.util.regex.import java.util.regex.* *; ;public class HaiGui implements Observerpublic class HaiGui implements Observer Subject subject; Su
59、bject subject; File myFile; File myFile; HaiGui(Subject subject,String fileName) HaiGui(Subject subject,String fileName) this.subject=subject; this.subject=subject; subject.addObserver(this); / subject.addObserver(this); /使当前实例成为使当前实例成为subjectsubject所引用的具体主题的观察者所引用的具体主题的观察者 myFile=new File(fileName)
60、;myFile=new File(fileName); public void hearTelephone(String heardMess) public void hearTelephone(String heardMess) try boolean boo=heardMess.contains(java try boolean boo=heardMess.contains(java程序员程序员)|heardMess.contains()|heardMess.contains(软件软件);); if(boo) if(boo) RandomAccessFile out=new RandomAcces
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024新疆农信社校园招聘沟通方案【招聘】
- 2024-2025年学生会外联部个人总结范文(28篇)
- 辽宁工程技术大学就业协议书
- 非全就业协议书
- 合同书面设置标准规范
- 合同审签工作总结
- 篮球教学课件
- 短跑 (体育本科专业)课件
- 《种子商品与市场》课件
- 《人事助理自我介绍》课件
- 护理查房慢性乙型病毒性肝炎护理查房
- 在实践中认识针刺麻醉原理
- 浙教版初中科学八年级上册《4.2电流的测量》教学设计附反思
- 医保检查自查自纠报告
- 原味英语交流吧智慧树知到答案章节测试2023年黑龙江农业工程职业学院(松北校区)
- 风量计算公式
- 人音版七上册音乐知识汇总
- 幼儿园幼儿教育数学领域核心经验
- proe基础教程(完整)演示文稿
- 行为金融学课后答案1至5章anawer
- 2023年报告文学研究(自考)(重点)题库(带答案)
评论
0/150
提交评论