结构型类模式???——》釆用继承机制来组合接口或实现;???——》有助于多个独立开发的类库协同工作;
Adapter(适配器)???——》将一个类的接口转换成客户希望的另外一个接口;???——》使得原本由于接口不兼容而不能一起工作的那些类可以一起工作;
解析:
类适配器???——》使用多重继承对一个接口与另一个接口进行匹配;
对象适配器可以适配它的父类接口;
1、Target???——》定义Client使用的与特定领域相关的接口;
2、Client与符合Target接口的对象协同;
3、Adaptee定义一个已经存在的接口,这个接口需要适配;
4、Adapter对Adaptee的接口与Target接口进行适配;
应用:
1、想使用一个已经存在的类,而它的接口不符合要求;
2、想使用一个已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口;
Bridge(桥接)???——》将抽象部分与其实现部分分离,使它们都可以独立地变化 ;
解析:
1、Abstraction定义抽象类的接口,维护一个指向Implementor类型对象的指针;
2、RefinedAbstraction扩充由 Abstraction定义的接口;
3、Implementor定义实现类的接口,该接口不一定要与 Abstraction的接口完全一致;???——》事实上这两个接口可以完全不同 ;???——》
Implementor接口仅提供基本操作;
Abstraction 定义了基于这些基本操作的较高层次的操作;
应用:
1、不希望在抽象和它的实现部分之间有一个固定的绑定关系 ;【例如】这种情况可能是因为,在程序运行时刻实现部分应可以被选择或者切換;
2、类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充;???——》 Bridge模式使得开发者可以对不同的抽象接口和实现部分进行组合,并分别对它们进行扩充 ;
3、对一个抽象的实现部分的修改应对客户不产生影响;即客户代码不必重新编译;
4、(c++)想对客户完全隐藏抽象的实现部分;
5、有许多类要生成的类层次结构;
6、想在多个对象间共享实现 (可能使用引用计数),但同时要求客户并不知道这一点;
Composite(组合)???——》将对象组合成树型结构以表示“部分一整体”的层次结构;???——》使得用户对単个对象和组合对象的使用具有一致性;
解析:
1、Component定义一个对象接口, 可以给这些对象动态地添加职责;
2、ConcreteComponent定义一个对象, 可以给这个对象添加一些职责;
3、Decorator维持一个指向 Component对象的指针,并定义一个与 Component接口一致;
4、ConcreteDecorator向组件添加职责;
应用:
1、在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责;
2、处理那些可以撤销的职责;
3、当不能采用生成子类的方式进行扩充时???——》
一种情况???——》可能有大量独立的扩展,为支持每一种组合将产生大量的子类, 使得子类数目呈爆炸性增长;
另一种情况???——》类定义被隐藏, 或类定义不能用于生成子类;
Facade(外观)???——》为子系统中的一组接口提供一个一致的界面;Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用;
解析:
1、Facade知道哪些子系统类负责处理请求;
2、Subsystem classes实现子系统的功能:处理有 Facade对象指派的任务;没有Facade的任何相关信息;
应用:
1、要为一个复杂子系统提供一个简单接口时, 子系统往往因为不断演化而变得越来越复杂;???——》大多数模式使用时都会产生更多更小的类,这使得子系统更具有可重用性,也更容易对子系统进行定制,但也给那些不需要定制子系统的用户带来一些使用上的困难;
2、客户程序与抽象类的实现部分之间存在着很大的依赖性;???——》引入 Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性;
3、当需要构建一个层次结构的子系统时,使用 Facade模式定义子系统中每层的入口点;???——》如果子系统之间是相互依赖的, 则可以让它们仅通过Faeade进行通信,从而简化了它们之间的依赖关系;
Flyweight(享元)???——》运用共享技术有效地支持大量细粒度的对象;
解析:
1、Flyweight描述一个接口,通过这个接口 Flyweight可以接受并作用于外部状态;
2、ConcreteFlyweight实现 Flyweight接口,并为内部状态(如果有)增加存储空间;
3、ConcreteFlyweight对象必须是可共享的;它所存储的状态必须是内部的,即它必须独立于ConcreteFlyweight对象的场景;
4、并非所有的Flyweight子类都需要被共享;Flyweight接口使共享成为可能,但它并不强制共享;在 Flyweight对象结构的某些层次,UnsharedConcreteFlyweight对象通常将ConcreteFlyweight对象作为子结点;
5、Flyweig]ltFactory 创建并管理Flyweight对象;确保合理地共享 Flyweight,当用户请求一个 Flyweight时,FlyweightFactory 对象提供一个已创建的实例或者在不存在时创建一个实例;
6、Client维持一个对 Flyweight的引用;计算或存储一个或多个 Flyweight的外部状态;
应用:
1、一个应用程序使用了大量的对象;
2、完全由于使用大量的对象,造成很大的存储开销;
3、对象的大多数状态都可变为外部状态;
4、如果删除对象的外部状态,那么可以用相对较少的共享对象取代很多组对象;
5、应用程序不依赖于对象标识;???——》由于 Flyweight对象可以被共享,所以对于概念上明显;有别的对象, 标识测试将返回真值;
Proxy(代理)???——》为其他对象提供一种代理以控制对这个对象的访问;
解析:
1、proxy保存一个引用使得代理可以访问实体;提供一个与 Subject的接口相同的接口;???——》使代理可以用来代替实体;控制对实体的存取, 并可能负责创建和删除它;其他功能依赖于代理的类型;
2、RemoteProxy负责对请求及其参数进行编码,并向不同地址空间中的实体发送已编码的请求;
3、VirtualProxy可以缓存实体的附加信息,以便延迟对它的访问;
4、protectionPtoxy检査调用者是否具有实现一个请求所必需的访问权限;
5、Subject定义RealSubject和Proxy的共用接口,这样就在任何使用 RealSubject的地方都可以使用Proxy;
6、RealSubject定义Proxy所代表的实体;
应用:
1、在需要比较通用和复杂的对象指针代替简单的指针的时候;
2、远程代理(Remoteproxy) 为一个对象在不同地址空问提供据不代表;
3、虚代理(VirtualProxy)根据需要创建开销很大的对象;
4、保护代理(Protection Proxy)控制对原始对象的访问,用于对象应该有不同的访问权限的时候;
5、只能指引 (Smart Reference)取代了简单的指针, 它在访问对象时执行一些附加操作典型用途包括:对指向实际对象的引用计数,这样当该对象没有引用时,可以被自动释放:当第一次引用一个持久对象时,将它装入内存;在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它;
了解这么多的结构型模式了;但是它们之间有什么区别呢???——》
Adapter VS Bridge
同点???——》
1、都给另一个对象提供一定程度上的间接性???——》利于系统的灵活性;
2、都涉及从自身以外的一个接口向这个对象转发请求;
差别???——》
1、Adapter???——》为解决两个已有接口之间不匹配的问题,不考虑这些接口是怎样实现的,也不考虑它们各自可能会如何演化;???——》不需要对两个独立设计的类中的任何一个进行重新设计,就能使它们协同工作;
2、Bridge???——》对抽象接口与它的(可能是多个)实现部分进行桥接;
3、Adapter模式在类已经设计好后实施;而Bridge模式在设计类之前实施;
Composite VS Decorator
同点:
1、都具有类似的结构;???——》说明它们都是基于递归组合来组织可变数目的对象;
区别:
1、Decorator旨在能够不需要生成子类即可给对象添加职责,这避免了静态实现所有功能组合而导致子类急剧增加;
2、Composite旨在构造类, 使多个相关的对象能够以统一的方式处理,而多重对象可以被当作一个对象来处理,重点在于表示;
3、两者通常协同使用;
Decorator VS Proxy
同点:
1、都描述了怎样为对象提供一定程度上的间接引用;
区别:
1、Proxy构成一个对象并为用户提供一致的接口;
2、Decorator不能动态地添加或分离性质,也不是为递归组合而设计的;???——》强调一种关系(Proxy 与它的实体之问的关系),这种关系可以静态地表达;???——》当直接访问一个实体不方便或不符合需要时, 为这个实体提供一个替代者;
3、Decorator组件仅提供部分功能;???——》使用于编译时不能确定对象的全部功能的情况;