设计模式:
设计模式:一般指软件设计模式。 软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
设计模式类型:
创建型模式:关注对象创建过程
结构型模式:处理类或对象的组合
行为类模式:描述类或对象交互和分配责任的方式
课程中只涉及其中的七种,它们通常采用继承或委托(delegation)的方式使得程序易于扩展。
Creational patterns创建型模式:
Factory Method pattern工厂方法模式
通常的创建类的实例的方式是采用new关键字,这需要我们知道要创建实例的类的名字,不过在一些特定情况下,例如client不知道/不确定/不关心要创建哪个具体类的实例(回忆在Lab2中创建Graph<L>接口的实现类对象,client不关心这个Graph是怎样实现),或者不想在client代码中指明要创建的实例时,这样的方法就显得不那么合适。这时我们可以采用工厂方法来创建实例,定义一个用于创建对象的接口,让该接口的子类型来决定实例化哪一个类,从而使一个类的实例化延迟到其子类。
优点:
用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;
缺点:
每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,增加了系统的复杂度
Structural patterns结构型模式:
Adapter 适配器模式:加个“适配器”以便于复用
将一个类的接口转换成客户希望的另外一个接口。
Adapter模式使原本由于接口不兼容而不能一起工作的类可以一起工作。
适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。
该模式的主要优点如下:
客户端通过适配器可以透明地调用目标接口。
复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
其缺点是:
对类适配器来说,更换适配器的实现过程比较复杂。
Decorator 装饰器模式
装饰器模式:装饰边框与被装饰物的一致性
装饰(Decorator)模式的定义:
指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
装饰(Decorator)模式的主要优点有:
采用装饰模式扩展对象的功能比采用继承方式更加灵活。
可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。
其主要缺点是:
装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。
装饰器模式通常用于对原本的ADT添加一些特性的任意组合,实际上是让ADT的方法拥有扩展的功能(而不是扩展ADT的方法种类),表现上通常是递归的、一层套一层的new。Decorator模式采用继承+委托(聚合式)实现,修饰功能主要体现在对通用操作的重写上。
Behavioral patterns 行为类模式:
Strategy 策略模式
即针对同一任务,给出不同的策略给客户端选择,这样使得我们代码实现有多样性,不是单一的实现。
策略模式
有多种不同的算法来实现同一个任务,但需要client根据需要动态切换算法,而不是写死在代码里。解决方案是为不同的实现算法构造抽象接口,利用delegation,运行时动态传入client倾向的算法类实例。
Template Method 模板模式
模板模式的特点是步骤是相同的,但是每一个步骤的实现可以有不同的选择,共性的步骤在抽象类内公共实现,差异化的步骤在各个子类中实现。模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。这就像一个模板一样,步骤是模板挖好的槽,我们往里填不同的东西。通常使用继承和重写实现模板模式。
Iterator迭代器模式
客户端希望对放入容器/集合类的一组ADT对象进行遍历访问,而无需关心容器的具体类型,也就是说,不管对象被放进哪里,都应该提供同样的遍历方式,这时采用Iterator Pattern。
Visitor 访问者模式
本质上是将数据和作用于数据上的某种/些特定操作分离开来,即对特定类型object的特定操作(visit),在运行时将二者动态绑定到一起,该操作可以灵活更改,无需更改被visit的类。为ADT预留一个将来可扩展功能的“接入点”,外部实现的功能代码可以在不改变ADT本身的情况下在需要时通过delegation接入ADT。
visitor是站在外部client的角度,灵活增加对ADT的各种不同操作(哪怕ADT没实现该操作),strategy则是站在内部ADT的角度,灵活变化对其内部功能的不同配置。