描述:

  • 如何组合类和对象以获得最大的结构;
  • 不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法;

分类:

适配器模式 http://blog.csdn.net/huo065000/article/details/22177651
装饰模式 http://blog.csdn.net/huo065000/article/details/22061403
代理模式 http://blog.csdn.net/huo065000/article/details/22177651
外观模式 http://blog.csdn.net/huo065000/article/details/23181031
享元 模式 详见下文
桥接模式 详见下文
组合模式 详见下文
适配器模式可分为:类的适配器模式,对象的适配器模式,接口的适配器模式,其中对象的适配器模式则是各结构模式的起源:

Bridge模式:

意图:
      将抽象部分与他的实现部分分离,使它们都可以独立的变化。其用意是:将抽象化与实现化解耦,使得二者可以独立变化。
      就如生活中一样:在公路上随处可见小汽车,公共汽车,他们不但可以在市区内公路上行驶,还可以在高速公路上行驶;也就是说,对于交通工具来说,他们有着不同的类型,同时它们所行驶的环境也在变化,在软件设计中要适应这种两个或者多维度的变化,就要涉及到桥接模式。
画一个简单的结构图:

FlyWeight模式:

      运用共享技术有效地支持大量细粒度的对象。主要解决由于相同数量过大而造成系统内存开销过大的问题。
      享元模式,顾名思义最大的优势就是共享啦!在此也分为两种状态,举一个常见的例子,现在网上购物已经是一个潮流了!自己当然也是其中的一员了!网上购物真的是减少了自己出门的频率,这对于不喜欢逛街的自己来说是最好不过的了!作为一个淘宝店主的话,比如经营一款畅销的女士板鞋,在订单中需要注明客户需要的板鞋信息,这样我们可以将板鞋产品抽象出来:
[csharp] view plaincopyprint?
  1. class Shoe
  2. {
  3. string color;
  4. int size;
  5. string position;
  6. public string Getcolor()
  7. {
  8. return color;
  9. }
  10. public void Setcolor(string color)
  11. {
  12. this.color = color;
  13. }
  14. //还有重复的size和position代码,不做重复
  15. }
class Shoe{string color;int size;string position;public string Getcolor(){return color;}public void Setcolor(string color){this.color = color;}//还有重复的size和position代码,不做重复}

      正如上边的代码一样,鞋子分为颜色,尺码和库存位置三项状态数据,其中颜色和尺码为鞋子的自然状态,我们称之为内部状态,这些状态只与对象本身有关,不会随外界的环境改变而发生变化;而库存位置,我们称之为外部状态,它与对象本身无必然关系,所以外部状态一般是由外界环境所决定的。

Composite模式:

意图:
      将对象组合成树形结构以表示“部分-整体”的层次结构。使得用户对单个对象和组合对象的使用具有一致性。看到树形结构突然想到了《数据结构》课本中“树”那一章节了,在书中给出了“树”的固有特性:一颗非空树是由若干颗子树构成的,而子树又可由若干颗更小的子树构成。而这里的子树可以是叶子,也可以是分支。
结构图:
适应性:
1.你想表示对象的部分-整体层次结构
2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

方式分类:

透明方式:
      看图就可发现,Leaf中没有Add和Remove。但是为了方便,也就是为了让Leaf和Composite具备统一的接口,所以在Component中声明所有用来管理子对象的方法,使叶节点和枝节点对于外界没有区别,具备完全一致的行为接口。但是这样问题也会很明显,因为Leaf本身没有,这样实现根本就没有了意义。
安全方式:
      在图中,不在Component接口中声明Add和Remove方法,即子类Leaf也不用去实现它,而是在子类Composite声明所有用来管理子类对象的方法,但是由于不够透明,所有树叶和树枝类不具有相同的接口,这样客户端调用时需要做相应的判断,带来了很大的不变。
      由此看来,使用的时候真的得视情况而定了啊!其实组合模式最大的动机也就是让用户在使用时无需对Leaf和Composite进行区分,可以一致的对待容器对象和叶子对象,这样不就倾向于透明方式了吗?

总结:

模式比较:

1)从代码的角度来看,发现其实适配器模式和代理模式有些相似,只是前者解决现有对象在新的环境中所遇到的问题,后者解决直接访问对象时出现的问题,所以这两种模式从使用角度来看的话都是解决直接访问对象时出现的问题,只是含义不十分相同而已。
2)从外观上来看的话,适配器模式和外观模式都是对系统的封装,只是适配器是用来适配对象的,而外观是用来配合整个子系统的。
3)就外观模式与代理模式来说,我觉得他们两个只是解决的侧重点不同而已,解决的思路还是一样的,都是通过引用一层间接层。外观可以同代理模式同时使用,因为外观对象完全可以是一个远程地址空间对象的远程代理,简称为外观代理模式或者代理外观模式。
对于模式的学习还需要进一步的加深与理解,继续!

设计模式总结-结构型模式相关推荐

  1. 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  2. 设计模式 之 结构型模式

    设计模式 之 结构型模式 模式 & 描述 包括 结构型模式 这些设计模式关注类和对象的组合.继承的概念被用来组合接口和定义组合对象获得新功能的方式. 适配器模式(Adapter Pattern ...

  3. 组合模式(Bridge Pattern) – 设计模式之结构型模式

    组合模式(Bridge Pattern) – 设计模式之结构型模式: 目录 组合模式(Component Pattern) 类图 例子1: 过程: 类图: 代码: 抽象组件:PlayerComposi ...

  4. 设计模式之结构型模式(5种)

    目录 结构型模式(Structural Pattern):怎么构造一个对象(行为.属性) 一.适配器模式 二.桥接模式(Bridge) 三.装饰者模式 设计模式在JAVA I/O库中的应用 案例 使用 ...

  5. 设计模式(17)-----结构型模式-----外观设计模式

    假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情 ...

  6. JAVA23种设计模式(2)-结构型模式7种

    JAVA23种设计模式(2)-结构型模式7种 把类结合在一起形成更大的结构 适配器模式(adapter) 一句话:将一个类的接口转换成另一种接口.让原本接口不兼容的类可以兼容 这是平时比较常见的一种模 ...

  7. 设计模式3——结构型模式

    结构型模式描述如何将类或对象按某种布局组成更大的结构,它分为类结构型和对象结构型模式,前者采用继承机制来组织接口和类,后者采用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦合度低,满足&q ...

  8. 设计模式:结构型模式-桥接、外观、组合、享元模式

    结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构.它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者采用组合或聚合来组合对象. 由于组合关系或聚合关系比继承关系耦 ...

  9. 设计模式_结构型模式学习

    其中,单例模式用来创建全局唯一的对象.工厂模式用来创建不同但是相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定创建哪种类型的对象.建造者模式是用来创建复杂对象,可以通过设置不同的可 ...

  10. 设计模式2—结构型模式

    结构型模式用来处理类或者对象的组合,主要包含以下7种设计模式: 1. 代理模式(Proxy Pattern)就是为其他对象提供一种代理以控制对这个对象的访问. 2. 装饰者模式(Decorator P ...

最新文章

  1. Android APK的签名--笔记版 V1 签名和V2签名总结
  2. 如何从JavaScript对象中删除项目[重复]
  3. webpack流程图
  4. 重设忘记的Mysql密码
  5. python发送qq邮件列表_Python SMTP发送邮件
  6. 湖人豪华助教团散伙 德帅身边恐仅剩两名帮手
  7. iOS 修改项目名称
  8. 程序员未来的职业生涯路该怎么走,如何避免35岁中年危机?
  9. 苹果新机发布在即 供应链齐泼冷水:卖不了7000万台
  10. 开课吧学python靠谱吗-开课吧的python课程怎么样,值得报名吗?
  11. linux 文件安装大全,linux 文件包安装大全
  12. 后缀数组模板 (详细注释)
  13. 查看docker run启动参数命令 runlike
  14. android 取消多个闹钟,如何在android中取消闹钟
  15. ASP.NET 即时通信,WebSocket服务端实例
  16. 在css中translate表示,css中位移translate()如何使用?translate用法总结
  17. C/C++笔试题(很多)
  18. origin画图_Origin作图过程中如何让图看起来更生动
  19. 用App Inventor做一个安卓程序
  20. oracle备份恢复(dmp文件)

热门文章

  1. esc中文是什么意思_汽车ESC什么意思 汽车ESC有什么用
  2. 展27类移动信息化解决方案,数字×××010通信展惊艳亮相
  3. 狂赚310亿美元!安卓系统的钱究竟是怎么来的--转自网友文章160303
  4. Java修真之练气筑基篇(持续更新)
  5. 给年轻数据科学家:从新手小白到专家大师的进阶之路
  6. 解决ie浏览器el-select选择后出现光标的问题
  7. 深度学习在美团点评的应用
  8. com、dll和activex
  9. 使用Python和Splinter实现12306火车票查询与抢票
  10. 浅谈ARM Cortex-M系列架构——架构篇