设计模式(一)

来源:互联网 发布:网络教育一对一策划书 编辑:程序博客网 时间:2024/05/29 00:33

引言:什么是设计模式

  1. 一般而言,一个模式有四个要素:

    1. 模式名称(pattern name):助记符,用一两个词来描述模式的问题、解决方案和效果。
    2. 问题(problem):描述了应该在何时使用模式。
    3. 解决方案(soluntion):描述了设计的组成成分,它们之间的相互关系以及各自的职责和协作方式。
    4. 效果(consequences):描述了模式应用的效果及使用模式应权衡的问题。

    出发点的不同会产生对什么是模式和什么不是模式的理解不同。

  2. 描述设计模式:模式名和分类、意图、别名、动机、适用性、结构、参与者、协作、效果、实现、代码示例、已知应用、相关模式

  3. 模式分类:根据两条准则对模式分类
    1. 目的准则:模式是用来完成什么工作的。
      1. 创建型(Creational):与对象的创建有关。
      2. 结构型(Structural):处理类和对象的组合。
      3. 行为型(Behavioral):对类或对象增氧交互和增氧分配职责进行描述。
    2. 范围准则:模式主要是用于类还是用于对象。
      1. 类模式:处理类和子类之间的关系,这些关系通过继承建立,是静态的,在编译时刻就确定了。
      2. 对象模式:处理对象间的关系,这些关系在运行时刻是可以变化的,更具动态性。
    3. 小结:创建型类模式将对象的布冯创建工作延迟到子类,而创建型对象模式则将它延迟到另一个对象中;结构性类模式使用继承机制来组合类,而结构性对象模式则描述了对象的组装方式;行为型类模式使用继承描述算法课控制流,而行为型对象模式则描述一组对象怎样协作完成单个对象所无法完成的任务。存在着许多组织设计模式的方法。从多维的角度去思考模式有助于对它们的功能、差异和应用场合的更深入理解。
  4. 设计模式怎样解决设计问题

    1. 寻找合适的对象:面向对象程序由对象组成,对象包括数据和对数据进行操作的过程,过程通常称为方法或操作。对象在收到客户的请求(或消息)后,执行相应的操作。
      面向对象最困难的部分是将系统分解为对象集合。要考虑到许多因素,诸如:封装、粒度、依赖关系、灵活性、性能、演化、复用等。它们都影响着系统的分解,并且通常还是相互冲突的。
      设计的许多对象来源于现实世界的分析模型。
      设计模式帮你确定并不明显的抽象和描述这些抽象的对象。
    2. 决定对象的粒度:对象在大小和数目上变化极大。它们能表示下自硬件或上自整个应用程序的任何事物。
    3. 指定对象接口:对象声明的每一个操作指定操作名、作为参数的对象和返回值,这就是操作的型构。对象操作所定义的所有操作型构的集合被称为该对象的接口。其描述了该对象所能接受的全部请求集合,任何匹配对象接口中型构的请求都可以发送给该对象。
      类型是用来标识特定接口的一个名字。一个对象可以有许多类型,并且不同的对象可以共享同一个类型。
      对象只有通过它们的接口才能与外部交流。发送给对象的请求和它的相应操作在运行时刻的链接就称为动态绑定(发送的请求直到运行时刻才受你的具体的实现的约束,即允许在运行时刻彼此替换有相同接口的对象,这种可替代性就称为多态)。
      设计模式通过确定接口的主要组成成分及经接口发送的数据类型,来帮助你定义接口。
      设计模式也指定了接口间的关系。
    4. 描述对象的实现:对象的实现由它的类决定的,类指定了对象的内部数据和表示,夜定义了对象所能完成的操作。抽象类的主要目的是为它的子类定义公共接口。
      1. 类继承与接口继承的比较
        一个对象的类定义了对象是怎样实现的,同时也定义了对象昂内部状态和操作的实现。但是对象的类型只与它的接口有关,接口即对象能响应的请求的集合。一个对象可以有多个类型,不同类的对象可以有相同类型。
        类继承根据一个对象的实现定义了另一个对象的实现。
        接口继承描述了一个对象什么时候能被用来替代另一个对象。
      2. 对接口编程,而不是对实现编程:不将变量声明为某个特定的具体类的实例对象,而是让它遵从抽象类所定义的接口。备注:创建型模式确保你的系统是采用针对接口的方式书写的,而不是针对实现而书写的。
    5. 运用复用机制
      1. 继承和组合的比较——优先使用对象组合而不是类继承
        类继承是在编译时刻静态定义的,且可直接使用,但有些缺点:①无法在运行时刻改变从父类继承的实现;②父类通常至少定义了部分子类的具体表示,所以继承通常被认为“破坏了封装性”。
        对象组合是通过获得对其他对象的引用而在运行时刻动态定义的。组合要求对象遵守彼此接口约定,进而要求更仔细地定义接口。因为对象只能通过接口访问,所以我们并不破坏封装性;只要类型一致,运行时刻还可以用一个对象来代替另一个对象;因为对象的实现是基于接口系的,所以实现上存在较小的依赖关系;优先使用对象组合有助于保持每个类被封装,并被几种在单个任务上。
      2. 委托:是一种组合方法,它使组合与继承同样的复用能力。
        委托的主要优点在于它便于运行时刻组合对象操作以及改变这些操作的组合方式。
        不足:动态的、高度参数化的软件比静态软件更难于理解。
        委托最适用于符合特定程式的情形,即标准模式的情形。
        委托时对象组合的特例。它告诉对象组合作为一个代码复用机制可以替代继承。
      3. 参数化类型:类属或模板(Templates)
        允许你在定义一个类型时并不指定该类型所用到的其他所有类型。未经指定的类型在使用时以参数形式提供。
      4. 区别
        1. 对象组合技术允许在运行时刻改变被组合的行为,但是它存在间接性、比较低效。
        2. 继承允许提供操作的缺省表现,并通过子类重定义这些操作。
        3. 参数化类型允许改变类所用到的类型。
        4. 继承和参数化类型都不能在运行时刻改变。
    6. 关联运行时刻和编译时刻的结构
      1. 代码结构在编译时刻就被确定,由继承关系固定的类组成。
      2. 程序的运行时刻结构是由快速变化的通信对象网络组成。
      3. 两个结构彼此独立
      4. 一个对象包含另一个对象或者是另一个对象的一部分,称为聚合,意味着聚合对象和其所有者有相同的生命周期。
      5. 相识意味着一个对象仅仅知道另一个对象,它们可能请求彼此的操作,但是它们不为对方负责。
    7. 设计应支持变化
      导致重新设计的原因

      1. 通过显示地制定一个类来创建对象
      2. 对特殊操作依赖
      3. 对硬件和软件平台依赖
      4. 对对象表示或实现依赖
      5. 算法依赖
      6. 紧耦合
      7. 通过生成子类来扩充功能
      8. 不能方便地对类进行修改

      设计模式通过减少依赖来提高内部复用性。
      框架是构成一类特定软件可服用设计的一组相互协作的类,规定了你的应用的体系结构。
      框架与设计模式的不同:

      1. 设计模式比框架更加抽象。
      2. 设计模式是比框架更小的体系结构元素。
      3. 框架比设计模式更加特立化。
  5. 怎样选择设计模式
    • 考虑设计模式是怎样解决设计问题的
    • 浏览模式的意图部分
    • 研究模式怎样互相关联
    • 研究目的相似的模式
    • 检查重新设计的原因。
    • 考虑设计中哪些是可变的
  6. 怎样使用设计模式
    1. 大致浏览一遍模式。
    2. 回头研究结构部分、参与者部分和协作部分
    3. 看代码实例部分,看看这个模式代码形式的具体例子
    4. 选择模式参与者的名字,使它们在应用上下文中有意义。
    5. 定义类
    6. 定义模式中专用于应用的操作名称
    7. 实现执行模式中责任和协作的操作。

备注

  • 设计模式不能够随意使用。
  • 通常通过引入额外的间接层次获得灵活性和可变性的同时,你也使设计变得更加复杂或牺牲了一定的性能。
  • 一个设计模式只有当它提供的灵活性是真正需要的时候,才有必要使用。
  • 衡量一个设计模式的得失时,它的效果部分是最能提供帮助的。
原创粉丝点击