设计模式(二)结构型

1、适配器模式(Adapter)

有两个类(客户类和被适配类)具有不兼容的接口,你想让他们一起工作,就需要一个适配器类来封装、转换被适配类的接口,让他能在客户类中使用。

有3类角色:

  • Client
    客户类,接口与被适配类不兼容
  • Adaptee
    被适配类,接口与客户类不兼容
  • Adapter
    适配器,被客户类使用,在适配器中转换被适配类的接口

分为两类:

  • 类适配器
    比如适配器继承Activity实现View.onClickListener,View为client,被称为类适配器。
  • 对象适配器
    比如RecyclerView.Adapter,被适配类的实例被包含在适配器中,所以被称为对象适配器。

注:对象适配器出现得更多,因为适配器可以有一个父类BaseAdapter,比起类适配器更加灵活。

2、桥接模式(Bridge)

当有一个类,他的某些属性容易变化,就用桥接模式将抽象和实现剥离,让两者可以分开变化。

有4类角色:

  • Abstraction
    包含一个Implementor的实例的抽象类,功能交由Implementor解决
  • RefinedAbstraction
    抽象的泛化、实现
  • Implementor
    一个抽象类或者接口
  • ContreteImplementor
    Implementor的泛化、实现

注:客户端里不容易出现那么善变的类,觉得用不上= =

3、组合模式(Composite)

将多个相似的对象组合,使他们能被一起操作。

例子:ViewGroup就是组合模式

有3个角色:

  • Component
    组合中,每个元素的抽象
  • Leaf
    组合中,每个元素的实现。可以有很多Leaf
  • Composite
    元素的组合,继承自Component。不同的是,新增了add和remove方法,可以增加删除元素。调用父类的方法时,会对所有元素调用一遍该方法。

注:当Component的公共方法很多时,Composite也会跟着变复杂

4、装饰模式(Decorator)

动态的给对象的方法添加功能。比起继承然后重写方法,更为灵活。

例子:Java的Writer

有4个角色:

  • Component
    被装饰的类
  • ConcreteComponent
    Component的实现或泛化
  • Decorator
    Component的装饰器,继承自Component,构造函数参数为Component
  • ConcreteDecorator
    Decorator的实现或泛化

注:与组合模式一样,当Component的公共方法很多时,Decorator工作量也会增加。用法与桥接模式类似,桥接跟适用于变化,装饰器更适用于扩展。

5、外观模式(Facade)

为大量的代码提供简单的接口。说简单点,就是子系统的外部方法。
外观模式太常用了,就比如MVC,M层和C层就都是外观模式,只要管好自己,别人干啥跟自己没关系了。

6、享元模式(Flyweight)

减少创建和修改元素的代价,重复使用元素。
通常使用哈希表以键值对的形式来存储元素,当元素再次被创建时,从哈希表中获取元素而非真的创建。

例子:RecyclerViewUniversalImageLoader

7、代理模式(Proxy)

作为另一个类的占位符,以提供访问控制、减少消耗、减少复杂性。

有3个角色:

  • Subject
    Proxy和RealSubject共同的父类
  • RealSubject
    Subject的泛化、实现
  • Proxy
    与RealSubject有同样的接口

注:很像装饰模式,但是有以下不同点:

代理模式,Proxy与RealSubject有相同的接口,和相同的构造方法。但是装饰模式的构造方法的参数一定是父类。
代理模式只能是一个类的实例的代理。但是装饰模式,只要是父类的子类,都可以被装饰。

分享到 评论