【软考】——面向对象技术(6)

版权声明:未经过博主同意,不得随意转发 https://blog.csdn.net/weixin_40918067/article/details/82795175

结构型类模式???——》釆用继承机制来组合接口或实现;???——》有助于多个独立开发的类库协同工作;

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组件仅提供部分功能;???——》使用于编译时不能确定对象的全部功能的情况;

大家给个赞,就是给我最大的鼓励!!!

注意:“赞”位于右上角;

猜你喜欢

转载自blog.csdn.net/weixin_40918067/article/details/82795175
今日推荐