设计模式总结
在课上学习了几种设计模式,在复习过程中对其又有了更深的认识,下面简单总结一下各种设计模式
创建型模式
factory methode工厂方法模式
当client不知道要创建哪个具体类的实例,或者不想在client代码中指明要具体创建的实例时,用工厂方法。
定义一个用于创建对象的接口,让其子类来决定实例化哪一个类,从而使一个类的实例化延迟到其子类。

- 抽象工厂模式定义了一个接口用于创建对象族,而无需明确指定具体类。
- 抽象工厂也是把对象的实例化交给了子类,即支持拓展。
- 同时提供给客户端接口,避免了用户直接操作子类工厂。
结构模式
adapter适配器模式
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。
通过增加一个接口,将已存在的子类封装起来,client面向接口编程,从而隐藏了具体子类。
- 举个例子(将USB接口转为VGA接口)

AdatperUSB2VGA 首先继承USBImpl获取USB的功能,其次,实现VGA接口,表示该类的类型为VGA。即完成了转换.
当然课上使用的是通过delegation来从USBImpl获取USB的功能,这样更符合ISP原则,即不强迫客户端使用不需要的/臃肿的接口
decorator装饰者模式
- 定义:动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性。
代码组成部分:
- Component(被装饰对象的基类)定义一个对象接口,可以给这些对象动态地添加职责。
- ConcreteComponent(具体被装饰对象)定义一个对象,可以给这个对象添加一些职责。
- Decorator(装饰者抽象类)维持一个指向Component实例的引用,并定义一个与Component接口一致的接口。
- ConcreteDecorator(具体装饰者)具体的装饰对象,给内部持有的具体被装饰对象,增加具体的职责。
被装饰对象和修饰者继承自同一个超类

简单可以理解为,右侧的子类为专精的化妆师,为左侧的普通人上各种各样的妆(就像你姐姐给你化妆一样~!)
对每一个特性构造子类,通过委派机制增加到对象上
关系模式
Strategy策略模式
- 定义: 策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。
- 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
- 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。
- 何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
- 如何解决:将这些算法封装成一个一个的类,任意地替换。
- 关键代码:实现同一个接口。
- 优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
- 缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

如图,客户端可以在A,B两种实现之间自由切换
策略模式注重对内部方法的统筹规划
Template Method模板模式
- 定义:定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。
- 通俗点的理解就是 :完成一件事情,有固定的数个步骤,但是每个步骤根据对象的不同,而实现细节不同;就可以在父类中定义一个完成该事情的总方法,按照完成事件需要的步骤去调用其每个步骤的实现方法。每个步骤的具体实现,由子类完成。

如图,此模式即保证了主要框架的一致性,有满足了各个子类方法所需的独特性
使用继承和重写实现模板模式
Iterator迭代器模式
- 定义:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
- 简单来说,不同种类的对象可能需要不同的遍历方式,我们对每一种类型的对象配一个迭代器,最后多个迭代器合成一个。
- 主要解决:不同的方式来遍历整个整合对象。
- 何时使用:遍历一个聚合对象。
- 如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。
- 关键代码:定义接口:hasNext, next,remove。(本质就是自己写一个迭代器)
- 应用实例:JAVA 中的 iterator。
- 优点:
- 它支持以不同的方式遍历一个聚合对象。
- 迭代器简化了聚合类。
- 在同一个聚合上可以有多个遍历。
- 在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
- 缺点:
- 由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
Visitor访问者模式
- 定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式。它将对数据的操作与数据结构进行分离。
访问者(Visitor)模式是一种对象行为型模式,其主要优点如下
- 扩展性好。能够在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。
- 复用性好。可以通过访问者来定义整个对象结构通用的功能,从而提高系统的复用程度。
- 灵活性好。访问者模式将数据结构与作用于结构上的操作解耦,使得操作集合可相对自由地演化而不影响系统的数据结构。
- 符合单一职责原则。访问者模式把相关的行为封装在一起,构成一个访问者,使每一个访问者的功能都比较单一。
访问者(Visitor)模式的主要缺点如下 - 增加新的元素类很困难。在访问者模式中,每增加一个新的元素类,都要在每一个具体访问者类中增加相应的具体操作,这违背了“开闭原则”。
- 破坏封装。访问者模式中具体元素对访问者公布细节,这破坏了对象的封装性。
- 违反了依赖倒置原则。访问者模式依赖了具体类,而没有依赖抽象类。

- 访问者模式包含以下主要角色。
- 抽象访问者(Visitor)角色:定义一个访问具体元素的接口,为每个具体元素类对应一个访问操作 visit() ,该操作中的参数类型标识了被访问的具体元素。
- 具体访问者(ConcreteVisitor)角色:实现抽象访问者角色中声明的各个访问操作,确定访问者访问一个元素时该做什么。
- 抽象元素(Element)角色:声明一个包含接受操作 accept() 的接口,被接受的访问者对象作为 accept() 方法的参数。
- 具体元素(ConcreteElement)角色:实现抽象元素角色提供的 accept() 操作,其方法体通常都是 visitor.visit(this) ,另外具体元素中可能还包含本身业务逻辑的相关操作。
- 对象结构(Object Structure)角色:是一个包含元素角色的容器,提供让访问者对象遍历容器中的所有元素的方法,通常由 List、Set、Map 等聚合类实现。
为ADT预留一个将来可扩展功能的“接入点”,外部实现的功能代码可以在不改变ADT本身的情况下通过delegation接入ADT
简单来说就是,可以随意在独立封装的方法里面加入新的方法,灵活性高
参考文章:

浙公网安备 33010602011771号