浅谈结构型模式 - 适配器模式,桥接模式,组合模式,装饰模式,外观模式,享元模式

1. 适配器模式 - ADAPTER

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

通俗解释1:去美国或者欧洲旅游会发现他们的电源插座和国内插头是不同的,这个时候带上充电头适配器这样去哪里都没问题了。充电头作为一个通用对象,在欧洲插座,有继承于充电头的欧洲插头,有继承于充电头适配器。适配器会将电流适配成国内充电头可以支持的电流,这样国内充电头也可以在欧洲插座上用了

2. 桥接模式 - BRIDGE

将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构 从而能在开发时分别使用

主要目的是将紧耦合变成松耦合:合成聚合复用原则 - 尽量不要使用类继承

紧耦合:每次增加一个手机品牌都要加两个类, thats bad

手机软件 -- 通讯录

    |  -- 三星通讯录

    |  -- 苹果通讯录

    --  游戏

      -- 三星游戏

      -- 苹果游戏

松耦合:如果有新的品牌,我们只需要扩展类,不需要修改类

手机品牌  <--- 包含  手机软件

  -- 三星        -- 通讯录  

  -- 苹果        -- 游戏

3. 组合模式 - COMPOSITE

将对象组合成树状结构 使得用户对单个对象和组合对象的使用具有一致性

通俗解释1:女朋友今天过生日,跟我说要送她一件礼物。我说没问题你自己挑。

- ”这件T恤挺漂亮,买,这条裙子好看,买,这个包是最新款,买。”

- “买了三件了呀,我只答应送一件礼物的哦”

- ”T恤加裙子加包包,正好配成一套呀,导购员,麻烦你包起来~“

“emmmmmmmmmmmmmm……”

女友也会用组织模式了

通俗解释2:当你希望用户可以忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象时,就可以考虑用组合模式了。用公司管理系统为例,他们有共同的方法:增加 删除 职责。

北京总公司

    -- 人力资源部

    -- 财务部

    -- 天津分公司

      -- 人力资源部

      -- 财务部

    -- 上海分公司

      -- 人力资源部

4. 装饰模式 - DECORATOR

通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为(嵌套结构),动态的给一个对象添加额外的职责

通俗解释1:来玩阿汤哥扮装游戏~

人                  阿汤哥

  -- 服饰 + Decorate(Person p)        

    -- T恤            T恤.Decorate(阿汤哥)

    -- 阔腿裤            阔腿裤.Decorate(T恤)

    -- 运动鞋            运动鞋.Decorate(阔腿裤)

                        最后得到 穿T恤 阔腿裤 运动鞋的阿汤哥

5. 外观模式 - FACADE

能为子系统的一组接口提供一个一致的界面,使得该子系统更加容易使用

给程序库 框架或其他复杂类提供一个简单的接口

通俗解释1:以基金公司为例:不想再做韭菜了,就把钱给基金公司帮我们打理钱。我们不用知道需要买什么股票,不用天天盯着股票,只用把钱交给基金公司,剩下的都是基金公司的事了,为韭菜们省了不少力。

韭菜们 --  基金公司 (Facade)

      -- 股票A

      -- 股票B

      -- 国债A

      -- 房地产A

6. 享元模式 - FLYWEIGHT

通过共享多个对象所共有的相同状态 使得在有限的内存容量中载入更多对象

通俗解释1:枪战游戏中大量的子弹 导弹和爆炸弹片这些粒子效果如果都由独立对象表示,内存很容易就会用光。粒子系统有很多相同的地方,比如颜色,sprite,而粒子的状态是不同的位置,速度等。我们可以把不变的常量存在内部状态中,而那些外在状态的数据保存在容量对象中。

通俗解释2:海王必备技能,每天给辣么多池塘里的鱼发短信太累了,海王想到一个好办法,把一些常用的句子存在手机里要用的时候直接拿出来,在前面加上池塘里的鱼的名字就可以发送了,再不用一个字一个字敲了。共享的句子就是Flyweight,池塘里的鱼的名字就是提取出来的外部特征,根据上下文情况使用。

7. 代理模式 - PROXY

提供一个代理来控制于原对象的访问

通俗解释1:小明追求小花,他不敢直接对小花说,于是他找他的好朋友小王,让小王帮他给小花送娃娃送花。小王在这里面就是充当着代理,小王和小明都继承了送礼物的接口。

实际运用:远程代理(WebService, WebReference),虚拟代理(创建开销较大的对象,可以用虚拟代理代替对象),安全代理(控制对象权限)等。

 Reference

  1. https://refactoringguru.cn/design-patterns
  2. 大话设计模式
  3. http://blog.sina.com.cn/s/blog_6e162de70101d0cf.html 
posted @ 2021-05-12 23:16  cancantrbl  阅读(180)  评论(0编辑  收藏  举报