1 / 79

Design Pattern (2)

Design Pattern (2). 设计模式 (2). 摘要. Design Patterns Why, What, How Creational, Structural and Behavioral Patterns. Structural Patterns. 结构模式描述如何将类或者对象结合在一起形成更大的结构。 类的结构模式:结构型类模式使用继承机制来组合接口或实现。 对象的结构模式:结构型对象模式描述了如何对一些对象进行组合,从而实现新功能的一些方法。可以在运行时刻改变对象组合关系。. Structural Patterns. Adapter

julie
Download Presentation

Design Pattern (2)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Design Pattern (2) 设计模式(2) Institute of Computer Software Nanjing University

  2. 摘要 • Design Patterns • Why, What, How • Creational,Structuraland Behavioral Patterns Institute of Computer Software Nanjing University

  3. Structural Patterns • 结构模式描述如何将类或者对象结合在一起形成更大的结构。 • 类的结构模式:结构型类模式使用继承机制来组合接口或实现。 • 对象的结构模式:结构型对象模式描述了如何对一些对象进行组合,从而实现新功能的一些方法。可以在运行时刻改变对象组合关系。 Institute of Computer Software Nanjing University

  4. Structural Patterns • Adapter • Bridge • Composite • Decorator • Facade • Flyweight • Proxy Institute of Computer Software Nanjing University

  5. Adapter • Aliases:Wrapper • Intent • 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 • Motivation • 有时为复用而设计的工具箱类不能够被复用的原因仅仅是因为它的接口与专业应用领域所需要的接口不匹配 Institute of Computer Software Nanjing University

  6. Example target adaptee adapter Institute of Computer Software Nanjing University

  7. Applicability • Use the Adapter pattern when • 你想使用一个已经存在的类,而它的接口不符合你的需求。 • 你想创建一个可以复用的类,该类可以与其它不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。 • (仅适用于对象Adapter)你想使用一些已经存在的类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。 Institute of Computer Software Nanjing University

  8. Structure 类适配器 对象适配器 Institute of Computer Software Nanjing University

  9. Participants • Target • 定义Client使用的与特定领域相关的接口 • Client • 与符合Target接口的对象协同 • Adaptee • 定义一个已经存在的接口,这个接口需要适配 • Adapter • 对Adaptee的接口与Target的接口进行适配 Institute of Computer Software Nanjing University

  10. Collaboration • Client在Adapter实例上调用一些操作,接着适配器调用Adaptee的操作实现这个请求。 Sample Code Institute of Computer Software Nanjing University

  11. Consequences • 本质上是两种重用模型 • class adapter: • 无法适配adaptee以及所有它的子类,但是可以重载adaptee的行为 • object adapter • 可以适配adaptee的所有子类,但重定义adaptee的行为比较困难 • Adapter的匹配精度:Adapter的工作量取决于Target接口与Adaptee接口的相似程度 • Pluggable Adapters:具有内部接口适配的类 Institute of Computer Software Nanjing University

  12. Consequences • 使用双向适配器提供透明操作 • 针对class adapter,用多重继承来实现 Institute of Computer Software Nanjing University

  13. Implementation • 使用继承机制实现class adapter • 使用内嵌对象技术实现object adapter • Pluggable Adapters • 使用抽象操作 • 使用代理对象 • 参数化的适配器:reflection技术 Institute of Computer Software Nanjing University

  14. Related Patterns • Bridge:结构类似,但Bridge的目的是将接口部分和实现部分分离,从而使得它们可以较为容易也相对独立的加以改变。而adapter则意味着改变一个已有对象的接口 • Decorator:增强了其它对象的功能而同时又不改变它的接口,透明性比adapter好 • Proxy:在不改变它的接口的条件下,为另一个对象定义了一个代理。 Institute of Computer Software Nanjing University

  15. 增:Default Adapter • 适配器模式的特例! • 缺省适配模式为一个接口提供缺省实现,这样子类型可以从这个缺省实现进行扩展,而不必从原有接口扩展。 • Motivation • Java中有着特殊的应用 • java.awt.event.WindowAdapter Institute of Computer Software Nanjing University

  16. Example abstract class 天星 implements和尚{ public void 吃斋(){}; public void 念经(){}; public void 打坐(){}; public void 撞钟(){}; public void 习武(){}; public String getName(){return null}; } interface 和尚{ public void 吃斋(); public void 念经(); public void 打坐(); public void 撞钟(); public void 习武(); public String getName(); } Adapter! class 鲁智深 extends 天星{ public void 习武(){ 拳打镇关西;大闹五台山;…} public String getName(){ return “鲁智深”;} } class 鲁智深 implements 和尚{ public void 习武(){ 拳打镇关西;大闹五台山;…} public String getName(){ return “鲁智深”;} } Compilation Passed! Compilation Error! Institute of Computer Software Nanjing University

  17. Applicability • 如果不准备实现一个接口的所有方法时,可以制造一个抽象类,给出所有方法的平庸的具体实现 • 适配器模式把一个类的接口变换成客户端所期待的另一种接口,适配器模式的“平庸化”形式可以使所考察的类不必实现不需要的那部分接口。 Institute of Computer Software Nanjing University

  18. Structure • ServiceAdapter应当是抽象类,但它所提供的方法却应当是具体的方法,而不是抽象的方法—提供默认实现。 • 具体子类可以按照需要只实现需要实现的方法,忽略不需要实现的方法。 Sample Code Institute of Computer Software Nanjing University

  19. Bridge • Aliases:Handle/Body • Intent • 将抽象部分与它的实现部分分离,使它们都可以独立地变化 • Motivation • 要做到“抽象(接口)与实现分离”,最常用的办法是定义一个抽象类,然后在子类中提供实现。也就是说,用继承机制达到“抽象(接口)与实现分离” • 但是这种方法不够灵活,继承机制把实现与抽象部分永久地绑定起来,要想独立地修改、扩展、重用抽象(接口)与实现都非常困难。 • 回顾下OCP和CARP原则… Institute of Computer Software Nanjing University

  20. Example 扩展Window抽象使之用于不同种类的窗口或新的平台很不方便 继承机制使得客户代码与平台相关 Institute of Computer Software Nanjing University

  21. Example 将Window抽象和它的实现部分分别放在独立的类层次结构中 针对窗口接口 针对平台的窗口实现 Institute of Computer Software Nanjing University

  22. Abstraction Implementation Abstraction Implementation 实现化 抽象化 实现化 抽象化 实现化2 抽象化 修正1 抽象化 修正2 具体 实现化1 具体 实现化2 实现化3 对“变化”的封装 Abstraction Implementation 实现化 抽象化 Bridge! 需要变化 需要变化 Institute of Computer Software Nanjing University

  23. Applicability • 编译时刻无法确定抽象(接口)与实现之间的关系 • 抽象部分与实现部分都可以通过子类化而扩展 • 对一个实现的修改不影响客户(无须重新编译) • 在C++中,对客户完全隐瞒实现细节 • 因为扩展的原因,需要把一个类分成两部分,(以便灵活组合) • 在多个对象之间共享数据,但客户不需要知道 Institute of Computer Software Nanjing University

  24. Structure Institute of Computer Software Nanjing University

  25. Participants • Abstraction • 定义抽象类的接口 • 维护一个指向Implementor类型对象的指针 • RefinedAbstraction • 扩充由Abstraction定义的接口 • Implementor • 定义实现类的接口,不一定要与Abstraction的接口完全一致,甚至可以完全不同 • ConcreteImplementor • 实现Implementor接口并定义它的具体实现 Institute of Computer Software Nanjing University

  26. Collaborations • Abstraction将Client的请求转发给它的Implementor对象 Sample Code Institute of Computer Software Nanjing University

  27. Consequences • 分离接口及其实现部分。抽象类的实现可以在运行时刻进行配置,一个对象甚至可以在运行时刻改变它的实现 • 提高可扩充性:抽象与实现两部分可以单独扩充 • 实现细节对客户透明 Institute of Computer Software Nanjing University

  28. Implementation • 仅有一个Implementor则没有必要创建一个抽象的Implementor -- 退化 • 创建正确的Implementor对象 • 根据客户环境,或者通过factory (回顾Abstract Factory) • 共享implementors • 资源管理:引用计数技术 • 采用多继承机制,依赖于静态继承, 不好 Institute of Computer Software Nanjing University

  29. Related Patterns • Abstract Factory可以用来创建和配置Bridge模式 • 与Adapter模式的区别 • Adapter模式用来帮助无关的类协同工作,通常在系统设计完成后才会被使用 • Bridge模式则在系统开始时就被使用,它使得抽象接口和实现部分可以独立进行改变 思考题:JDBC/ODBC桥梁是Bridge模式吗? Institute of Computer Software Nanjing University

  30. Composite • Intent • 将对象组合成树形结构以表示“部分-整体”的层次结构,Composite使得用户对单个对象和组合对象的使用具有一致性。 • Motivation • 一些部件对象经过组合构成的复合部件对象仍然具有单个部件对象的接口,这样的复合部件对象被称为“容器(container)” • 复合部件与单个部件具有同样的接口,所有接口包含两部分:单个部件的功能、管理子部件的功能 • 递归组合 Institute of Computer Software Nanjing University

  31. Example Institute of Computer Software Nanjing University

  32. Applicability • 想表示对象的“部分-整体”层次结构 • 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象 Institute of Computer Software Nanjing University

  33. Structure Institute of Computer Software Nanjing University

  34. Participants • Component • 为组合中的对象声明接口 • 在适当的情况下实现所有类共有接口的缺省行为 • 声明一个接口用于访问和管理Component的子组件 • (可选)在递归结构中定义一个接口,用于访问一个父部件,并在合适的情况下实现它。 • Leaf • 在组合中表示叶节点对象,没有子节点 • 在组合中定义图元对象的行为 • Composite • 定义有子部件的那些部件的行为 • 存储子部件 • 在Component接口中实现与子部件有关的操作 • Client • 通过Component接口操纵组合部件的对象 Institute of Computer Software Nanjing University

  35. Collaborations • 用户使用Component类接口与组合结构中的对象进行交互。如果接收者是一个叶节点,则直接处理请求。如果接收者是Composite,它通常将请求发送给它的子部件,在转发请求之前与/或之后可能执行一些辅助操作。 Sample Code Institute of Computer Software Nanjing University

  36. Consequences • 定义了包含leaf对象和composite对象的类层次接口。—— 递归结构 • 简化客户代码,客户一致地处理复合对象和单个对象 • 使得更容易增加新类型的组件,易于增加新类型的组件 • 使设计变得更加一般化,无法限制类型的组合,可以在运行时刻通过类型检查加以弥补 Institute of Computer Software Nanjing University

  37. Implementation • 显式的父对象的引用,在子对象中给出父对象的引用,可以很容易地遍历所有的父对象 • 共享组件:当一个组件只有一个父部件时,很难共享 • 最大化Component接口? • 声明管理子部件的操作:在安全性和透明性之间权衡 • Component是否应该实现一个Component列表? • 子部件排序 • 使用高速缓存存储改善性能 • 应该由谁删除Component • 存储组件最好用哪一种数据结构: List, Array, HashMap? Institute of Computer Software Nanjing University

  38. Related Patterns • Decorator经常和Composite一起使用,通常有一个公共的父类 • Flyweight可以共享组件但是不再能引用他们的父类对象 • Iterator:可用来遍历Composite • Visitor:将本来应该分布在Composite和Leaf类中的操作和行为局部化 思考题:考虑如何实现安全方式的Composite Institute of Computer Software Nanjing University

  39. Decorator • Aliases: Wrapper • Intent • 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活 • 动机 • 希望给某个对象而不是整个类添加一些功能 Institute of Computer Software Nanjing University

  40. Example Institute of Computer Software Nanjing University

  41. Example Institute of Computer Software Nanjing University

  42. Applicability • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责 • 处理那些可以撤销的职责 • 当不能采用生成子类的方法进行扩充时 • 可能有大量独立的扩展,为支持每一种组合将产生大量的子类 • 类定义被隐藏或者类定义不能用于生成子类 Institute of Computer Software Nanjing University

  43. Structure Institute of Computer Software Nanjing University

  44. Participants • Component • 定义一个对象接口,可以给这些对象动态地添加职责 • ConcreteComponent • 定义一个对象,可以给这个对象添加一些职责 • Decorator • 维持一个指向Component对象的指针,并定义一个与Component接口一致的接口 • ConcreteDecorator • 向组件添加职责 Institute of Computer Software Nanjing University

  45. Collaboration • Decorator将请求转发给它的Component对象,并有可能在转发请求前后执行一些附加的动作。 Sample Code New Decorator1( new Decorator2 ( new Decorator3 ( new ConcreteComponent()))) 思考题:查看Java IO包,思考其中所使用的设计模式 Decorator1 包裹图 Decorator2 Decorator3 ConcreteComponent Institute of Computer Software Nanjing University

  46. Consequence • 优点 • 比静态继承更灵活 • 避免在层次结构高层的类有太多的特征 • 缺点 • Decorator与它的Component不一样,使用装饰时不应该依赖对象标识 • 有许多小对象 Institute of Computer Software Nanjing University

  47. Implementation • 接口的一致性,装饰对象的接口必须与它所装饰的Component的接口是一致的 • 当仅需要添加一个职责时可以省略抽象的Decorator类 • 保持Component类的简单性 • 改变对象外壳与改变对象内壳的区别,结合Strategy模式 Institute of Computer Software Nanjing University

  48. Related Patterns • Adapter:Decorator模式中装饰仅改变对象的职责而不改变它的接口,而Adapter模式中适配器将给对象一个全新的接口 • Composite:可以将装饰视为一个退化的仅有一个组件的组合,Decorator的目的不在于对象聚集 • Strategy:用一个装饰可以改变对象的外表,而Strategy模式可以改变对象的内核 Institute of Computer Software Nanjing University

  49. Facade • Intent • 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使这一子系统更加容易使用 • Motivation • 使系统的各子系统之间的关联最小,引入一个facade对象,为子系统提供一个简单的、泛化的设施 Institute of Computer Software Nanjing University

  50. Example Institute of Computer Software Nanjing University

More Related