面向对象的设计模式

3-面向对象的设计模式 - 图1

设计模式的定义

  • 每一种模式都描述了一种问题的解决方案,汇集了但多数人解决问题的经验。
  • 一种可以重复使用的解决方案
  • 一个设计模式的几个部分
    • 模式名称:由少量的字组成的名称,有利于我们表达我们的设计。
    • 模式里的角色:必不可少的核心功能是由哪几个类实现的
    • 待解决的问题:描述何时需要运用这种模式,以及运用模式的环境及上下文
    • 解决方案:描述组成设计的元素(类和对象)、它们的关系、职责以及合作。
    • 结论:运用这种方案所带来的利和弊。主要指它对系统的弹性、扩展性、可移植性的影响。

      设计模式的分类

      从功能分

      创建模式

关注的是对象的创建,创建型模式将创建对象的过程进行了抽象,也可以理解为将创建对象的过程进行了封装,作为客户程序仅仅需要去使用对象,而不再关心创建对象过程中的逻辑。

  • 简单工厂模式(Simple Factory)
  • 工厂方法模式(Factory Method)
  • 抽象工厂模式(Abstract Factory)
  • 创建者模式(Builder)
  • 原型模式(Prototype)
  • 单例模式(Singleton)

结构模式

将类或者对象组合在一起形成更大的结构。结构型模式是为解决怎样组装现有的类,设计它们的交互方式,从而达到实现一定的功能目的。结构型模式包容了对很多问题的解决。例如:扩展性(外观、组成、代理、装饰)、封装(适配器、桥接)

  • 外观模式/门面模式(Facade门面模式)
  • 适配器模式(Adapter)
  • 代理模式(Proxy)
  • 装饰模式(Decorator)
  • 桥梁模式/桥接模式(Bridge)
  • 组合模式(Composite)
  • 享元模式(Flyweight)

行为模式

对在不同的对象之间划分责任和算法的抽象化。行为型模式涉及到算法和对象间职责的分配,行为模式描述了对象和类的模式,以及它们之间的通信模式,行为模式刻划了在程序运行时难以跟踪的复杂的控制流可分为行为类模式(使用继承机制)和行为对象模式(使用对象聚合)。

  • 模板方法模式(Template Method)
  • 观察者模式(Observer)
  • 状态模式(State)
  • 策略模式(Strategy)
  • 职责链模式(Chain of Responsibility)
  • 命令模式(Command)
  • 访问者模式(Visitor)
  • 调停者模式(Mediator)
  • 备忘录模式(Memento)
  • 迭代器模式(Iterator)
  • 解释器模式(Interpreter)

三者之间的区别和联系

创建型模式提供生存环境,结构型模式提供生存理由,行为型模式提供如何生存。

  1. 创建型模式为其他两种模式使用提供了环境。
  2. 结构型模式侧重于接口的使用,它做的一切工作都是对象或是类之间的交互,提供一个门。
  3. 行为型模式顾名思义,侧重于具体行为,所以概念中才会出现职责分配和算法通信等内容。

    从方式分

  • 类模式:以继承的方式实现,静态的
  • 对象模式:以组合的方式实现,动态的

几种常见模式

工厂模式

简单工厂

适配器模式

  • 类适配器
    • 不推荐
    • 使用了继承,可能违反里氏替换原则
    • 继承不是为了复用,只是为了能调用父类的方法
  • 对象适配器

组合模式

适用于树状结构的实现

装饰器模式

装饰者和被装饰者都实现同一个接口,一个作为另一个的构造器的入参
然后在调用方法的时候,可以调用入参的方法。
装饰者和被装饰者可以互换。
3-面向对象的设计模式 - 图2
3-面向对象的设计模式 - 图3

各种设计模式的代码都差不多,但在不同的场景下有不同的需求,要解决的问题不同,所以模式就不同

设计模式的应用

JUnit使用的模式

模板方法模式

• 抽象方法
• 强制子类需要实现的方法,需要子类补充实现的细节
• 模板 方法
• 定义模板的逻辑
• 子类不需要覆盖的情况下要使用final
• 钩子方法
• 不是一定要子类覆盖的方法
• 一般会提供一个默认实现(缺省适配器模式)
• 子类选择性地覆盖,以便实现在特定的时机触发自己的代码

策略模式

• JUnit实现eclips的plugin接口,实现eclips中junit插件的功能
• 抽象类TestCase,由我们自定义的测试用例实现

Spring的设计模式

依赖注入和控制反转

容器的作用

单例模式

3-面向对象的设计模式 - 图4

SpringMVC模式

3-面向对象的设计模式 - 图5
3-面向对象的设计模式 - 图6


老师的经验

  • 不要陷入CRUD的代码,应该尝试着去写一些框架
  • 重点不是设计模式,而是为了开发框架,框架是为了架构
  • 架构师要能控制代码的写法
  • 复杂问题和有难度的问题
    • 首先应该集中精力攻克有难度的问题,将难题转换成复杂问题
    • 复杂问题只是工作量和调度的问题
  • 发现问题和解决方案
    • 发现问题比解决方案更难
    • 设计模式就是解决方案,可以套用。但首先要能发现问题