结构型模式

结构型模式

结构模式包括:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

一、适配器模式(本质:转换匹配,复用功能)

适配器模式,即把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作。

适配器模式中三种角色:

  • 目标角色(Target):这是客户所期待的接口。目标可以实具体的或抽象的类,也可以使接口。
  • 源角色(Adaptee):需要适配的类。
  • 适配器角色(Adapter):通过在内部包装一个Adaptee对象,把源接口转换成目标接口。

实现要点:

  • 适配器模式主要用用于“希望复用一些现存的类,但接口与复用环境要求不一致的情况”,在遗留代码复用、类库迁移等方面非常有用。
  • 适配器模式有对象适配器和类适配器两种形式的实现结构。类适配器采用多继承的实现方式,带来了不良的高耦合;对象适配器采用对象组合的方式,更符合松耦合精神。

优点:

  • 更好的复用性
  • 更好的可扩展性

缺点:

  • 过多地使用适配器,会让系统非常凌乱,不容易整体进行把握。

二、装饰模式(本质:动态组合。动态是手段,组合是目的)

装饰模式,动态地给一个对象添加一些额外的职责,就增加功能而言,装饰模式比生成子类更灵活

装饰模式种三种角色:

  • 抽象构成角色(Component):给出一个抽象接口,以规范准备接收附加责任的对象。
  • 具体构成角色(Concrete Component):实现组件对象接口,通常就是被装饰器装饰的对象。
  • 装饰角色(Decorator):持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
  • 具体装饰角色(Concrete Decorator):负责给构件对象“贴上”附加的责任

特点:

  • 装饰模式为对象添加额外责任的方式就像是做蛋糕一样,一圈圈地加上去,中间核心蛋糕胚是被装饰的对象,是核心任务,外围即装饰对象。
  • 装饰模式包含装饰对象和装饰核心两种。
  • 被装饰的对象不一定是最原始的那个对象,也可能是被其他装饰器装饰过的对象,反正实现的同一接口,即同一类型。
  • 装饰模式的效果是:让我们可以创建以“被装饰的对象–负责新功能的对象–开始的一条对象” 的链,并接收与出租对象。
    优点:
  • 装饰模式与继承关系的目都是要扩展对象的功能,但装饰模式可以提供比继承更多的灵活性。
  • 通过使用不同不同的装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。

缺点:

  • 会产生很多细粒度对象

装饰模式与策略模式:

  • 策略模式改变的是对象的内核,装饰模式改变的是对象的外壳
  • 策略模式是一层调用,装饰模式是递归调用
  • 而两者可以有机结合

三、代理模式 (本质:控制对象访问)

代理模式:为其他对象提供一种代理以控制对这个对象的访问。

代理模式中三种角色:

  • 抽象主题角色(Subject):声明了真实主题和代理主题的共同接口,这样一来任何使用真实主题的地方都可以使用代理主题。
  • 代理角色(Proxy):代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象。代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候替代主题;控制真实主题的应用,负责在需要的时候创建与删除真实主题对象。
  • 真实主题角色(RealSubject):定义了代理角色所代表的真实对象。

  • 代理模式给某个对象提供题个替身或占位符,以控制对这个对象的访问
  • 所谓代理,就是一个人或者一个机构代表另一个人或另一个机构采取行动,即起在客户端与目标对象之间中介的作用

代理模式应用:

  • 远程代理: 一个位于不同的地址空间的对象提供一个局域代表对象。可以隐藏一个对象存在于不同地址空间的事实。这个不同的地址空间可以使在本机器中,也可是在另一台机器中。远程代理又叫做大使。可以将网络的细节隐藏起来,使得客户端不必考虑网络的存在。客户完全可以认为被代理的对象是局域的而不是远程的,而代理对象承担了大部分的网络通信工作。
  • 虚拟代理: 代理对象可以在必要的时候才将被代理的对象加载。代理可以对加载过程加以必要的优化。当一个模块的加载十分耗费资源的时候,虚拟代理的优点就非常明显。
  • 保护代理: 可以在运行时对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理的对象。授权机制:不同级别的用户对同一对象拥有不同的访问权利。
  • 智能引用代理: 当一个对象呗引用是,提供一些额外的曹锁,比如讲对此对象调用的次数记录下来等。

代理模式与适配器模式:

  • 两者有差异有相似性。
  • 相似性:都是为另一个对象提供间接性访问,而且都是从自身意外的一个接口向这个对象发送请求。
  • 差异:功能不同,适配器模式主要用于解决接口不匹配的问题,通常是为所适配的对象提供一个不同接口;而代理模式会实现和目标对象相同的接口。

代理模式与装饰模式

  • 实现上相似,功能上不同
  • 装饰模式的实现和保护代理的实现上是类似的都是在转调其他对象的前后执行一定的功能,但他们的目的和功能都是不同的。
  • 装饰模式的目的是为了让你不生成子类就可以给对象添加职责,也就是为了动态的增加功能;代理模式的主要目的是为了控制对对象的访问。

四、外观模式(本质:封装交互,简化调用)

外观模式(门面模式):外部与一个子系统的通信必须通过一个统一的外观(Facade)对象进行。

外观模式中两种角色:

  • 外观角色(Facede):客户端可以调用这个角色的方法,,此角色知晓相关的子系统的功能和责任,在正常情况下,本角色会将从客户端发来的请求委派到相应的子系统去。
  • 子系统角色(subsystem):可以同时有一个或者多个子系统。每个子系统不是一个单独的类,而是一个类的集合。每个子系统都可被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面是另外一个客户端

使用外观模式的情况:

  • 当客户程序与抽象类的实现部分之间有很大依赖性时,使用外观模式为一个复杂子系统提供一个简单接口。
  • 在层次化结构种,可以使用外观模式定义系统种每一层的入口点;若子系统之间相互依赖,则可以让他们之间仅通过外观通信,简化依赖。
  • 希望包装或隐藏原有系统

优点:

  • 屏蔽了外部客户端和系统内部模块的交互
  • 外观的功能可以被多个客户端调用,可以实现复用(功能的共享)
  • 对使用Facade的人员,节省了学习成本

缺点:

  • 不符合开闭原则

五、桥接模式(本质:分离抽象和实现)

桥接模式:将抽象的部分与它的实现部分分离,使他们都可以独立变化。

模式结构:

  • 由抽象化角色和修正抽象化角色组成的抽象化等级结构。
  • 由实现化角色和两个具体实现化角色所组成的实现化等级结构。
  • 在桥接模式中的桥接是单向的,也就是只能是抽象部分的对象去使用具体实现部分的对象,而不能反过来。也就是个单向桥。
  • 使用Bridge模式和原始解决方案的根本区别在于是通过继承还是通过合成\聚合的方式去实现一个功能需求。因此面向对象分析和设计中有一个原则就是:类似继承但不是继承

六、组合模式(本质:同意叶子对象和组合对象)

组合模式:将对象组合称树形结构以表示‘部分整体’的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

组合模式中三个角色:

  • 抽象构件角色(Component):这是一个抽象角色,它给参与组合的对象规定一个接口。这个角色给出共有接口及其默认行为。
  • 树叶构件角色(Leaf) :代表参加组合的树叶对象。一个树叶对象没有下级子对象。
  • 树枝构建角色(Composite):代表参加组合的有子对象的对象,并给出树枝构件对象的行为。

优点:

  • 定义了包含基本对象和组合对象的类层次结构。基本对象可以组合成组合对象,组合对象又能组合成更复杂的组合对象,可以不断地递归组合下去,从而构成一个统一的组合对象的类层次结构
  • 统一了组合对象和叶子对象
  • 简化了客户端调用,不必区分组合对象和叶子对象
  • 更容易扩展,由于是客户端同一的面对抽象构件来操作,因此,定义新的叶子构件和树枝构件能够很容易的与已有结构一起工作而不需改变客户端。

缺点:

  • 很难限制组合中的组件类型。

七、享元模式(本质:分离与共享)

享元模式:运用共享技术有效地支持大量细粒度的对象
享元对象能做到共享的关键是区分内部状态和外部状态。内部状态是存储在享元对象内部并且不会随环境改变而改变。因此内部状态可以共享。

优点:
大幅度地降低内存中对象的数量,节省内存空间

缺点:

  • 享元模式使得系统更加复杂。为了使对象可以共享,需要将一些状态外部化,这使得程序的逻辑复杂化。
  • 享元模式将向原对象的状态外部化,而读取外部状态使得运行时间变长。

享元模式重点:

  • 共享内部状态,加载外部状态
  • 变与不变
  • 享元模式设计的重点就在分离变与不变。把一个对象的状态分成内部状态的外部状态,内部状态是不变的,外部状态是可变的。然后通过共享不变的部分,达到减少对象数量并节约内存的目的。
  • 分离变与不变是软件设计上最基本的方式之一,比如预留接口:一个常见的原因就是这里存在变化,可能在今后需要扩展或者是改变已有的实现,因此预留接口作为“可插入性的保证”。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅梦曾倾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值