结构类设计模式主要解决如何通过多个小对象组合出一个大对象的问题,如使用继承和接口实现将多个类组合在一起。 ### 适配器模式(Adapter) **概念** 将一个类的接口**变换成客户端所期待的另一种接口,**从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。 **使用场景** 你有动机修改一个已经投产中的接口时,适配器模式可能是最适合你的模式。比如系统扩展了,需要使用一个已有或新建立的类,但这个类又不符合系统的接口,怎么办?详细设计阶段不要考虑使用适配器模式,使用主要场景为扩展应用中。 ![适配器模式-默认适配器](images/Algorithm/适配器模式-默认适配器.png) ![适配器模式-对象适配器](images/Algorithm/适配器模式-对象适配器.png) ![适配器模式-类继承](images/Algorithm/适配器模式-类继承.png) ### 组合模式(Composite) **概念** 将对象组合成树形结构以表示**“部分-整体”**的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 **使用场景** - 维护和展示部分-整体关系的场景,如树形菜单、文件和文件夹管理 - 从一个整体中能够独立出部分模块或功能的场景 - 只要是树形结构,就考虑使用组合模式 **案例**:每个员工都有姓名、部门、薪水这些属性,同时还有下属员工集合(虽然可能集合为空),而下属员工和自己的结构是一样的,也有姓名、部门这些属性,同时也有他们的下属员工集合。 ![组合模式](images/Algorithm/组合模式.png) ### 代理模式(Proxy) **概念** 为其他对象**提供一种代理以控制**对这个对象的访问。 ![代理模式](images/Algorithm/代理模式.png) ### 享元模式(Flywight) **概念** 使用共享对象可有效地**支持大量的细粒度的对象。** 对象的信息分为两个部分:内部状态(intrinsic)与外部状态(extrinsic)。 - **内部状态:**内部状态是对象可共享出来的信息,存储在享元对象内部并且不会随环境改变而改变 - **外部状态:**外部状态是对象得以依赖的一个标记,是随环境改变而改变的、不可以共享的状态 **使用场景** - 系统中存在大量的相似对象 - 细粒度的对象都具备较接近的外部状态,而且内部状态与环境无关,也就是说对象没有特定身份 - 需要缓冲池的场景 ### 门面模式(Facade) **概念** 要求一个子系统的外部与其内部的通信必须**通过一个统一的对象进行。**门面模式提供一个高层次的接口,使得子系统更易于使用。 **使用场景** - 为一个复杂的模块或子系统提供一个供外界访问的接口 - 子系统相对独立——外界对子系统的访问只要黑箱操作即可 - 预防低水平人员带来的风险扩散 ![门面模式](images/Algorithm/门面模式.png) ### 桥接模式(Bridge) **概念** 将**抽象和实现解耦,**使得两者可以独立地变化。 **使用场景** - 不希望或不适用使用继承的场景 - 接口或抽象类不稳定的场景 - 重用性要求较高的场景 ![桥梁模式-1](images/Algorithm/桥梁模式-1.png) ![桥梁模式-2](images/Algorithm/桥梁模式-2.png) ### 装饰器模式(Decorator) **概念** 动态地给一个对象**添加一些额外的职责。**就增加功能来说,装饰模式相比生成子类更为灵活。 **使用场景** - 需要扩展一个类的功能,或给一个类增加附加功能 - 需要动态地给一个对象增加功能,这些功能可以再动态地撤销 - 需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式