11 面向可复用性和可维护性的设计模式
创建模式:工厂方法
结构模式
适配器模式:具有不兼容接口的类可以通过将其自己的接口包装在现有类的接口周围来协同工作
装饰器模式
行为模式:
策略模式:允许在运行时选择一系列算法中的一个
模板模式:规定抽象逻辑,实现细节需要实现
迭代器模式:顺序访问元素,不会表示泄漏
访问者模式:将算法和对象结构分开
为什么需要可复用性:
除了类本身,设计模式更强调多个类/对象之间的关系和交互过程—比接口/类复用的粒度更大
11.1 创建型模式
工厂方法模式:虚拟构造器
当client不知道/不确定要创建哪个具体类的实例,或者不想在client代码中指明要具体创建的实例时,用工厂方法。
定义一个用于创建对象的接口,让该接口的子类型来决定实例化哪一个类,从而使一个类的实例化延迟到其子类。
相比于通过构造器(new)构建对象:
静态工厂方法可具有指定的更有意义的名称
不必在每次调用的时候都创建新的工厂对象
可以返回原返回类型的任意子类型
11.2 结构化模式
11.2.1 适配器模式
主要解决类之间接口不兼容的问题。
通过增加一个接口,将已存在的子类封装起来,client面向接口编程,从而隐藏了具体子类。
主要有两种类型:继承/委托
适配器模式(Adapter)包含以下主要角色:
目标(Target)接口:当前系统业务所期待的接口,它可以是抽象类或接口。
适配者(Adaptee)类:它是被访问和适配的现存组件库中的组件接口。
适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者。
11.2.2 装饰器模式
问题引出:当有许多子类需要自由组合的时候,Java无法多继承,也不适合顺序继承,因此需要一种机制可以为对象增加不同侧面的特性。
解决方法:对每一个特性构造子类,通过委派机制增加到对象上。装饰器同时使用子类型和委派。
装饰(Decorator)模式中的角色:
抽象构件(Component)角色 :定义一个抽象接口以规范准备接收附加责任的对象。
具体构件(Concrete Component)角色 :实现抽象构件,通过装饰角色为其添加一些职责。
抽象装饰(Decorator)角色 : 继承或实现抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
具体装饰(Concrete Decorator)角色 :实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
装饰者模式的核心是装饰类,这个类是个抽象类,是抽象构件的子类,同时与抽象构件具有委托关系,即在其内部调用了抽象构件。