设计模式-01
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
定义一组算法,将每个算法都封装起来,并且使它们之间可以 互换。策略模式使这些算法在客户端调用它们的时候能够互不 影响地变化;
Template [ 模板模式 ]
定义了一个算法步骤,并允许子类为一个或多个步骤提供实现 。子类在不改变算法架构的情况下,可重新定义算法中某些步 骤;
Visitor [ 访问者模式 ]
Bridge [桥接模式]
桥接模式的用意是将问题的抽象和实现分离开来实现,通过用 聚合代替继承来解决子类爆炸性增长的问题;
Structural Patterns
Composite [ 组合模式 ]
定义一个接口,使之用于单一对象,也可以应用于多个单一对 象组成的对象组;
Decorator [ 装饰模式 ]
学习的层次:
套用基本掌握真正理解
引 例
假设两个木匠在讨论如何为橱柜制作抽屉的问题 : 木匠1:你认为我们应该怎么制作这些抽屉?
木匠2:呜,我想我们应该这样做结合部分,在木 材上直锯下去,然后回转45o锯,然后再直锯下去 ,再朝另一个方向回转45o锯,再直锯下去,然后 ……
类 比
Structural Patterns
结构型模式讨论的是类和对象的结构,它采用继 承机制来组合接口或实现(类结构型模式),或 者通过组合一些对象来实现新的功能(对象结构 型模式) Adapter [适配器模式]
将一个类的接口适配成用户所期待的接口。一个适配器允许因 为接口不兼容而不能在一起工作的类工作在一起,做法是将类 自己的接口包装在一个已存在的类中;
Builder [ 建造者模式 ]
将复杂对象创建与表示分离,同样的创建过程可创建不同的表 示。允许用户通过指定复杂对象类型和内容来创建对象,用户 不需要知道对象内部的具体构建细节;
Prototype [ 原型模式 ]
通过“复制”一个已经存在的实例来返回新的实例(不新建实 例)。被复制的实例就是“原型”,这个原型是可定制的。原 型模式多用于创建复杂的或者耗时的实例,因为这种情况下, 复制一个已经存在的实例使程序运行更高效;或者创建值相等 ,只是命名不一样的同类数据;
Iterator [ 迭代器模式 ]
提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对 象的内部表示;
Mediator [ 中介者模式 ]
用一个中介对象来封装一系列的对象交互;
Memento [ 备忘录模式 ]
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之 外保存这个状态。这样以后就可将该对象恢复到原先保存的状态;
Command [ 命令模式 ]
将请求及其参数封装成一个对象,作为命令发起者和接收者的 中介,可以对这些请求排队或记录请求日志,以及支持可撤销 操作;
Behavioral Patterns
Interpreter [ 解释器模式 ]
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个 解释器使用该表示来解释语言中的句子;
Observer [ 观察者模式 ]
定义了对象之间一对多的依赖,当这个对象的状态发生改变的时候, 多个对象会接受到通知,有机会做出反馈;
Behavioral Patterns
State [ 状态模式 ]
允许一个“对象”在其内部状态改变的时候改变其行为,即不 同的状态,不同的行为
Strategy [ 策略模式 ]
背 景
1970s ,Christopher Alexander 的建筑 师 提出设计模式概念。 直到 1987,一些设计模式的论文和文章 出现了 。 1995年 ,GOF [四人帮]发表了书: 《设 计模式-可复用面向对象软件的基础》( Design Patterns: Elements of Reusable Object-Oriented Software )
表示一个作用于某对象结构中的各元素的操作。可以在不改 变各元素的类的前提下定义作用于这些元素的新操作;
Object-Oriented Method
抽象(Abstraction) 封装(Encapsulation) 多态(Polymorphism) 继承(Inheritance)
Object-Oriented Method
类的功能要单一,体现了抽象 加强内聚,松散耦合 好的封装性 类的粒度要合理 实现类不能依赖使用类 应考虑灵活性,也就是可配置,可维护
Behavioral Patterns
着力解决的是类实体之间的通讯关系,希望以面 向对象的方式描述一个控制流程。
Chain of Responsibility [ 责任链模式 ]
很多对象由每一个对象对其下一个对象的引用而连接起来形成 一条链。请求在这个链上传递,直到链上的某一个对象决定处 理此请求。发出这个请求的客户端并不知道链上的哪一个对象 最终处理这个请求,这使系统可以在不影响客户端的情况下动 态的重新组织链和分配责任;
程序中的代码复审:
我在这里使用一个While 循环来…
继之以一串If语句来…
在这里我使用一个Switch来处理…
程序在做什么?为什么要这么做?
实际发生的可能是这样:
Байду номын сангаас
木匠1:我们应该用一个燕尾接合还是一个斜面 接合?
他真正的问题是:我们应该用一个制作昂贵 但美观又耐用的接合,还是应该只用一个制 作快速、不美观的接合来至少维持到检查结 束?
设计模式的理解
设计模式的理解 重在思想上的理解
是经验的积累,模式没有最好,只有更好
设计模式还在不断地发展
设计模式不是软件业独有,各行各业都存在
设计模式不是被发明的,而是被发现的。 设计模式能干什么 能让我们复用一些优秀的解决方案,从而使程 序设计的比较精良,还能加快开发。
什么是程序设计
软件开发的过程,基本是先分析需要解决的问题, 找到解决问题的方法,然后解决办法用程序语言进 行描述,然后使用编写好的程序解决问题。 而程序设计指的是,如何找到解决问题的方法,如 何组织代码,如何划分程序结构合理。
好的设计可以:
更好的完成任务;更合理的系统组成;更好的性能 ;更好的可扩展性、可维护性、稳定性等…
背 景
目前企业级分布式软件开发普遍采用面向对象的方法, OOD直接导致了设计模式的发展。 开发面向对象的软件是困难的,而开发可复用的面向对象的 软件更难。 有经验的设计者重用过去的方案。 采用设计模式使设计和代码具有良好的可维护性、可复用性 和可升级性。 “Design patterns help you learn from others„ successes instead of your own failures.”
给对象动态添加额外的职责,就好像给一个物体加上装饰物, 完善其功能;
Façade [ 外观模式 ]
外观模式为子系统提供了一个更高层次、更简单的接口,从而 降低了子系统的复杂度,使子系统更易于使用和管理。外观承 担了子系统中类交互的责任
Structural Patterns
Flyweight [ 享元模式 ]
如何描述设计模式
模式名和分类
意图:设计模式是做什么的?它的基本原理和意图是 什么?它解决的是什么样的特定设计问题? 动机:说明一个设计问题以及如何用模式中的类、对 象来解决该问题的特定情景
适用性:什么情况下可以使用该设计模式?该模式可 用来改进哪些不良设计?如何识别这些情况? 结构:采用对象建模技术对模式中的类进行图形描述
Abstract Factory [ 抽象工厂模式 ]
为一个产品族提供统一的创建接口。当需要这个产品族的某一 系列的时候,可以从抽象工厂中选出相应的系列创建一个具体 的工厂类;
Creational Patterns
Singleton [ 单例模式 ]
保证一个类有且仅有一个实例,提供一个全局访问点;
参与者:指设计模式中的类 和/或 对象以及它们各自 的职责
如何描述设计模式
协作:模式的参与者如何协作以实现其职责 效果:模式如何支持其目标?使用模式的效果和所需 做的权衡取舍?系统结构的哪些方面可以独立改变? 实现:实现模式时需了解的一些提示、技术要点及应 避免的缺陷,以及是否存在某些特定于实现语言的问 题 代码示例:用来说明怎样实现该模式的代码片段
Flyweight是一个共享对象,它可以同时在不同上下文( Context)使用;
Proxy [ 代理模式 ]
在软件系统中,有些对象有时候由于跨越网络或者其他障碍, 而不能够或者不想直接访问另一个对象,直接访问会给系统带 来不必要的复杂性,这时候可以在客户程序和目标对象之间增 加一层中间层,让代理对象来代替目标对象打点一切,这就是 代理(Proxy)模式;
The basic elements of design pattern
模式名称(Pattern Name)
问题(Problem):描述应该在何时使用模式。解释了设计问题和 问题存在的前因后果,可能还描述模式必须满足的先决条件;
解决方案(Solution):描述了设计的组成成分、相互关系及各自 的职责和协作方式。模式就像一个模板,可应用于多种场合,所 以解决方案并不描述一个具体的设计或实现,而是提供设计问题 的抽象描述和解决问题所采用的元素组合(类和对象); 效果(consequences ):描述模式的应用效果及使用模式应权衡 的问题
设计模式的核心思想是通过增加抽象层,把变化部分 从那些不变部分里分离出来
GOF(Gang of Four)的设计模式
定义:设计模式是在一个 上下文 中, 对一个问题 的 解决方案,及其能够达 到的效果。即模式的四要素:名称、 上下文与问题、解决方案、效果。 分类:23种设计模式:
创建型:5种 结构型:7种 行为型:11种
What is design pattern ?
广义讲,软件设计模式是可解决一类软件问题并 能重复使用的软件设计方案;
狭义讲,设计模式是对被用来在特定场景下解决 一般设计问题的类和相互通信的对象的描述。是 在类和对象的层次描述的可重复使用的软件设计 问题的解决方案;[面向对象]
设计模式体现的是程序整体的构思,所以有时候它也 会出现在分析或者是概要设计阶段
Pattern
Pattern(模式) A pattern is a discernible regularity in the world or in a manmade design. As such, the elements of a pattern repeat in a predictable manner. 模式 是在物体或事件上,产生的一种规律变化与 自我重复的样式与过程。在模式之中,某些固定 的元素不断以可预测的方式周期性重现。
相关模式:与这个模式紧密相关的模式有哪些?其不 同之处是什么?这个模式应与哪些其他模式一起使用 ?
为什么要学习设计模式
设计模式是优秀的解决方案,使我们在解决问题时,有所 参考,能够在设计方案上复用; 专业人员常用词汇,便于交流、建立通用的术语; 让系统更专业,架构更合理; 对于问题、设计过程和面向对象,设计模式给你一个更高 层次的视角,将你从“过早处理细节”的“暴政”中解放 出来;
Design Patterns
by Junhui Liu
School of Software
Yunnan University
Learning goals
Coder
Designer
Related courses
数据结构
操作系统
软件工程
UML
Java
Program Design
都有哪些设计模式?
GOF共提出23种设计模式:
创建型:5种 结构型:7种 行为型:11种
Creational Patterns
用来创建对象的模式,抽象了实例化过程
Factory Method [ 工厂模式 ]
父类负责定义创建对象的公共接口,而子类则负责生成具体对 象,将类的实例化操作延迟到子类中完成;
Template [ 模板模式 ]
定义了一个算法步骤,并允许子类为一个或多个步骤提供实现 。子类在不改变算法架构的情况下,可重新定义算法中某些步 骤;
Visitor [ 访问者模式 ]
Bridge [桥接模式]
桥接模式的用意是将问题的抽象和实现分离开来实现,通过用 聚合代替继承来解决子类爆炸性增长的问题;
Structural Patterns
Composite [ 组合模式 ]
定义一个接口,使之用于单一对象,也可以应用于多个单一对 象组成的对象组;
Decorator [ 装饰模式 ]
学习的层次:
套用基本掌握真正理解
引 例
假设两个木匠在讨论如何为橱柜制作抽屉的问题 : 木匠1:你认为我们应该怎么制作这些抽屉?
木匠2:呜,我想我们应该这样做结合部分,在木 材上直锯下去,然后回转45o锯,然后再直锯下去 ,再朝另一个方向回转45o锯,再直锯下去,然后 ……
类 比
Structural Patterns
结构型模式讨论的是类和对象的结构,它采用继 承机制来组合接口或实现(类结构型模式),或 者通过组合一些对象来实现新的功能(对象结构 型模式) Adapter [适配器模式]
将一个类的接口适配成用户所期待的接口。一个适配器允许因 为接口不兼容而不能在一起工作的类工作在一起,做法是将类 自己的接口包装在一个已存在的类中;
Builder [ 建造者模式 ]
将复杂对象创建与表示分离,同样的创建过程可创建不同的表 示。允许用户通过指定复杂对象类型和内容来创建对象,用户 不需要知道对象内部的具体构建细节;
Prototype [ 原型模式 ]
通过“复制”一个已经存在的实例来返回新的实例(不新建实 例)。被复制的实例就是“原型”,这个原型是可定制的。原 型模式多用于创建复杂的或者耗时的实例,因为这种情况下, 复制一个已经存在的实例使程序运行更高效;或者创建值相等 ,只是命名不一样的同类数据;
Iterator [ 迭代器模式 ]
提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对 象的内部表示;
Mediator [ 中介者模式 ]
用一个中介对象来封装一系列的对象交互;
Memento [ 备忘录模式 ]
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之 外保存这个状态。这样以后就可将该对象恢复到原先保存的状态;
Command [ 命令模式 ]
将请求及其参数封装成一个对象,作为命令发起者和接收者的 中介,可以对这些请求排队或记录请求日志,以及支持可撤销 操作;
Behavioral Patterns
Interpreter [ 解释器模式 ]
给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个 解释器使用该表示来解释语言中的句子;
Observer [ 观察者模式 ]
定义了对象之间一对多的依赖,当这个对象的状态发生改变的时候, 多个对象会接受到通知,有机会做出反馈;
Behavioral Patterns
State [ 状态模式 ]
允许一个“对象”在其内部状态改变的时候改变其行为,即不 同的状态,不同的行为
Strategy [ 策略模式 ]
背 景
1970s ,Christopher Alexander 的建筑 师 提出设计模式概念。 直到 1987,一些设计模式的论文和文章 出现了 。 1995年 ,GOF [四人帮]发表了书: 《设 计模式-可复用面向对象软件的基础》( Design Patterns: Elements of Reusable Object-Oriented Software )
表示一个作用于某对象结构中的各元素的操作。可以在不改 变各元素的类的前提下定义作用于这些元素的新操作;
Object-Oriented Method
抽象(Abstraction) 封装(Encapsulation) 多态(Polymorphism) 继承(Inheritance)
Object-Oriented Method
类的功能要单一,体现了抽象 加强内聚,松散耦合 好的封装性 类的粒度要合理 实现类不能依赖使用类 应考虑灵活性,也就是可配置,可维护
Behavioral Patterns
着力解决的是类实体之间的通讯关系,希望以面 向对象的方式描述一个控制流程。
Chain of Responsibility [ 责任链模式 ]
很多对象由每一个对象对其下一个对象的引用而连接起来形成 一条链。请求在这个链上传递,直到链上的某一个对象决定处 理此请求。发出这个请求的客户端并不知道链上的哪一个对象 最终处理这个请求,这使系统可以在不影响客户端的情况下动 态的重新组织链和分配责任;
程序中的代码复审:
我在这里使用一个While 循环来…
继之以一串If语句来…
在这里我使用一个Switch来处理…
程序在做什么?为什么要这么做?
实际发生的可能是这样:
Байду номын сангаас
木匠1:我们应该用一个燕尾接合还是一个斜面 接合?
他真正的问题是:我们应该用一个制作昂贵 但美观又耐用的接合,还是应该只用一个制 作快速、不美观的接合来至少维持到检查结 束?
设计模式的理解
设计模式的理解 重在思想上的理解
是经验的积累,模式没有最好,只有更好
设计模式还在不断地发展
设计模式不是软件业独有,各行各业都存在
设计模式不是被发明的,而是被发现的。 设计模式能干什么 能让我们复用一些优秀的解决方案,从而使程 序设计的比较精良,还能加快开发。
什么是程序设计
软件开发的过程,基本是先分析需要解决的问题, 找到解决问题的方法,然后解决办法用程序语言进 行描述,然后使用编写好的程序解决问题。 而程序设计指的是,如何找到解决问题的方法,如 何组织代码,如何划分程序结构合理。
好的设计可以:
更好的完成任务;更合理的系统组成;更好的性能 ;更好的可扩展性、可维护性、稳定性等…
背 景
目前企业级分布式软件开发普遍采用面向对象的方法, OOD直接导致了设计模式的发展。 开发面向对象的软件是困难的,而开发可复用的面向对象的 软件更难。 有经验的设计者重用过去的方案。 采用设计模式使设计和代码具有良好的可维护性、可复用性 和可升级性。 “Design patterns help you learn from others„ successes instead of your own failures.”
给对象动态添加额外的职责,就好像给一个物体加上装饰物, 完善其功能;
Façade [ 外观模式 ]
外观模式为子系统提供了一个更高层次、更简单的接口,从而 降低了子系统的复杂度,使子系统更易于使用和管理。外观承 担了子系统中类交互的责任
Structural Patterns
Flyweight [ 享元模式 ]
如何描述设计模式
模式名和分类
意图:设计模式是做什么的?它的基本原理和意图是 什么?它解决的是什么样的特定设计问题? 动机:说明一个设计问题以及如何用模式中的类、对 象来解决该问题的特定情景
适用性:什么情况下可以使用该设计模式?该模式可 用来改进哪些不良设计?如何识别这些情况? 结构:采用对象建模技术对模式中的类进行图形描述
Abstract Factory [ 抽象工厂模式 ]
为一个产品族提供统一的创建接口。当需要这个产品族的某一 系列的时候,可以从抽象工厂中选出相应的系列创建一个具体 的工厂类;
Creational Patterns
Singleton [ 单例模式 ]
保证一个类有且仅有一个实例,提供一个全局访问点;
参与者:指设计模式中的类 和/或 对象以及它们各自 的职责
如何描述设计模式
协作:模式的参与者如何协作以实现其职责 效果:模式如何支持其目标?使用模式的效果和所需 做的权衡取舍?系统结构的哪些方面可以独立改变? 实现:实现模式时需了解的一些提示、技术要点及应 避免的缺陷,以及是否存在某些特定于实现语言的问 题 代码示例:用来说明怎样实现该模式的代码片段
Flyweight是一个共享对象,它可以同时在不同上下文( Context)使用;
Proxy [ 代理模式 ]
在软件系统中,有些对象有时候由于跨越网络或者其他障碍, 而不能够或者不想直接访问另一个对象,直接访问会给系统带 来不必要的复杂性,这时候可以在客户程序和目标对象之间增 加一层中间层,让代理对象来代替目标对象打点一切,这就是 代理(Proxy)模式;
The basic elements of design pattern
模式名称(Pattern Name)
问题(Problem):描述应该在何时使用模式。解释了设计问题和 问题存在的前因后果,可能还描述模式必须满足的先决条件;
解决方案(Solution):描述了设计的组成成分、相互关系及各自 的职责和协作方式。模式就像一个模板,可应用于多种场合,所 以解决方案并不描述一个具体的设计或实现,而是提供设计问题 的抽象描述和解决问题所采用的元素组合(类和对象); 效果(consequences ):描述模式的应用效果及使用模式应权衡 的问题
设计模式的核心思想是通过增加抽象层,把变化部分 从那些不变部分里分离出来
GOF(Gang of Four)的设计模式
定义:设计模式是在一个 上下文 中, 对一个问题 的 解决方案,及其能够达 到的效果。即模式的四要素:名称、 上下文与问题、解决方案、效果。 分类:23种设计模式:
创建型:5种 结构型:7种 行为型:11种
What is design pattern ?
广义讲,软件设计模式是可解决一类软件问题并 能重复使用的软件设计方案;
狭义讲,设计模式是对被用来在特定场景下解决 一般设计问题的类和相互通信的对象的描述。是 在类和对象的层次描述的可重复使用的软件设计 问题的解决方案;[面向对象]
设计模式体现的是程序整体的构思,所以有时候它也 会出现在分析或者是概要设计阶段
Pattern
Pattern(模式) A pattern is a discernible regularity in the world or in a manmade design. As such, the elements of a pattern repeat in a predictable manner. 模式 是在物体或事件上,产生的一种规律变化与 自我重复的样式与过程。在模式之中,某些固定 的元素不断以可预测的方式周期性重现。
相关模式:与这个模式紧密相关的模式有哪些?其不 同之处是什么?这个模式应与哪些其他模式一起使用 ?
为什么要学习设计模式
设计模式是优秀的解决方案,使我们在解决问题时,有所 参考,能够在设计方案上复用; 专业人员常用词汇,便于交流、建立通用的术语; 让系统更专业,架构更合理; 对于问题、设计过程和面向对象,设计模式给你一个更高 层次的视角,将你从“过早处理细节”的“暴政”中解放 出来;
Design Patterns
by Junhui Liu
School of Software
Yunnan University
Learning goals
Coder
Designer
Related courses
数据结构
操作系统
软件工程
UML
Java
Program Design
都有哪些设计模式?
GOF共提出23种设计模式:
创建型:5种 结构型:7种 行为型:11种
Creational Patterns
用来创建对象的模式,抽象了实例化过程
Factory Method [ 工厂模式 ]
父类负责定义创建对象的公共接口,而子类则负责生成具体对 象,将类的实例化操作延迟到子类中完成;