1.适配器模式(Adapter)

基础教程

看了<<设计模式>>和这篇文章,觉得适配器的一个重点就是 对象所提供的接口并不一定能适应我们的新环境,我们就要对其转换成我们需要的接口(其实不适应新环境就是类成员函数名称不一样,无法通过父类指针直接操作子类)

设计模式里面有一个例子就是在程序上绘制几何图形的问题,我们有LineShape,PolygnShape都继承自Shape,也有统一的接口,比如有个接口BoundingBox,现在我们要加入一个TextShape,一般是要自己重新写一个,但是已经有程序库提供了TextView经过稍微更改可以满足我们的需求,但是类的成员函数名跟我们不一致,比如TextView有一个成员函数BoundingFun的功能跟BoundingBox一样

这种情况下我一般可以直接使用TextView或者创造一个类TextView2,继承自TextView,这个也是我认为比较好的方法,节省时间,又重用代码

但是如果我们想可以直接通过shape的指针来操作这个TextShape,也就是说我们的客户只要new了一个几何图形后,不管是LineShape还是TextShape,都可以通过一样的接口去操作,这个时候我们可以让TextShape 以public的方式继承Shape,以private的方式继承TextView,或者有个私有的TextView成员变量,这样我们就可以达到上述的目的

适配器模式又分为对象适配器和类适配器,其实就是一个通过组合,一个通过继承来实现适配器,当然我更倾向于组合,因为如果我们后面TextView有了子类,比如TextView2,当我们要对这些类进行适配,如果使用继承我们就需要再创造一个类,比如TextShape2,但是如果我们使用组合,我们就可以通过给TextShape来增加一个SetTextView的接口,可以直接通过同样的接口来操作TextView2

 装饰者模式(DECORATOR):

基础教程

顾名思义,装饰者模式就是给类加上一点装饰,我们有一个DECORATOR和Component,如果我们要对Component或者他的基类进行附加操作,那么我们可以用DECORATOR对Component进行装饰,然后DECORATOR对Component的操作进行附加操作,DECORTOR更倾向于改变对象的外壳,而不是Strategy倾向于改变对象的内核

<<设计模式>>里面有一个例子,就是TextView控件的问题,TextView控件有一个父类VisualComponent,TextView通过Draw来绘制,但是不支持有滚动条,现在我们需要TextView有滚动条的功能,那我们该怎么办??

一般我会新建一个类,名字叫TextViewScroll,然后有这样如果我需要一个有滚动条的TextView控件,那么只要新建这个类就可以了,但是如果我们现在有另外一个控件,比如List,这个类也是继承自VisualComponent,这个控件也需要滚动条,那我们是不是还要再创建一个TextViewScroll??

这个时候我们 就需要一个装饰者,就是给TextView和List装饰一个滚动条,这个时候我们也有一个装饰者Decorator,这个类继承自VisualComponent,而且这个类可以接受一个VisualComponent的类或者子类,当我们需要滚动条的时候,只要让Decorator去装饰传入的VisualComponent的类,在Draw控件的时候顺便Draw滚动条

这个模式有个缺点就是如果被装饰的对象没有公共的父类,并且没有统一的接口,那么就没办法使用装饰者,只能用我说的那个方法(可能后面有其他的方法,再继续看看)

享元模式(Flyweight)

基础教程

享元模式给我的感觉更像是另外一个版本的写时复制,不同的是更改的时候,比如有三个字符串A,B,C,A字符串指向"ABC",B指向"BCD",此时如果C=A,那么C也指向"ABC",内存中实际只有两个字符串"ABC"和"BCD",如果这个时候把C="BCD",如果是写时复制,那么这个时候C会指向"BCD",但是不是B所指向的"BCD",是新的内存,这样内存中就有三块内存,ABC,BCD,BCD,如果是享元模式,那么C会先在所有可以共享的字符串里面查找是否有"BCD",如果有,那么直接把C指向"BCD",那样内存中就只有两块,"ABC"和"BCD"

我的理解就是享元会创造一组可以共享的内存,如果我们需要更改一些对象的数据,那么会先在这些内存中查找,然后直接让该对象指向共享的内存,没有再进行创建

享元适用于一些有大量重复内容的数据,比如<<设计模式>>提到的一个文档编辑器,文档编辑器如果每一个字符都要用一个对象存储的话,那么对内存是很损耗的,但实际上字母也就二十几个而已,这些字母都是一样的,只有字符的位置和颜色不一样,这个时候字符就是 可以共享的,只有位置和颜色不可共享,可以把可共享的提取出来(当然一个字符指针实际上比一个字母更耗内存,这里只是举个例子)

外观和代理(FACADE,PROXY)

说实话我觉得这两个模式是一样的,就是再加一层用以掩盖内部的情况,不过我没想到share_ptr是代理模式

桥接模式(BRIDGE):

桥接模式给我的感觉也是一个代理模式或者说是外观模式的变种,他们提供给用户的都只是接口,掩盖了内部的实现

<<设计模式>>举了个例子,就是跨平台的窗口,BRIDGE模式将抽象和实现分离,实现就是WindowImp这些,通过Windows类里面的WindowsImp指针,根据不同的平台创建不同的类,然后就可以掩盖Window究竟调用的是XWindow还是PMWindow的实现,

组合模式(COMPOSITE):

如上图,组合模式就是用户对单个对象还是组合对象的使用都具有一致性,我的理解就是不管是0403这个节点也好,还是04-0401-0402-0403,还是整棵树,对于用户提供的接口都是一样的,用户不必去关心Add或者Remove的时候究竟是叶节点还是子树

看设计模式感觉看得还是挺迷糊的,只能说慢慢去理解,不过设计模式这种东西毕竟还是靠实践,只能说以后做东西尽量看看能不能使用设计模式,当然只是为了增加经验而已,千万不要动不动就设计模式设计模式

看完了这些,感觉结构型模式还是要在知道要做什么基础上去使用,否则根本无法把整个架构给设计好,不过目前我还没到那个水平,只能说尽量把代码写得低耦合,以及可读性好,这样后期更改会很容易

转载于:https://www.cnblogs.com/linyilong3/archive/2013/01/01/2840210.html

设计模式读书笔记之结构型模式相关推荐

  1. 设计模式(三)结构型模式介绍及实例

    文章目录 一.适配器模式 1.1 适配器模式定义 1.2 适配器模式主要角色 1.3 适配器模式特点 1.4 适配器模式实现方式 1.4.1 类适配器模式 1.4.2 对象适配器模式 1.5 适配器模 ...

  2. 《设计模式详解》结构型模式 - 组合模式

    组合模式 5.6 组合模式 5.6.1 概述 5.6.2 结构 5.6.3 案例实现 5.6.4 组合模式的分类 5.6.5 优点 5.6.6 使用场景 完整的笔记目录:<设计模式详解>笔 ...

  3. 《设计模式详解》结构型模式 - 外观模式

    外观模式 5.5 外观模式 5.5.1 概述 5.5.2 结构 5.5.3 案例 5.5.4 使用场景 5.5.5 Tomcat 源码 完整的笔记目录:<设计模式详解>笔记目录,欢迎指点! ...

  4. 《设计模式详解》结构型模式 - 桥接模式

    桥接模式 5.4 桥接模式 5.4.1 概述 5.4.2 结构 5.4.3 案例 5.4.4 使用场景 完整的笔记目录:<设计模式详解>笔记目录,欢迎指点! 结构型模式描述如何将类或对象按 ...

  5. 《设计模式详解》结构型模式 - 适配器模式

    适配器模式 5.2 适配器模式 5.2.1 概述 5.2.2 结构 5.2.3 类适配器模式 5.2.4 对象适配器模式 5.2.5 接口适配器模式 5.2.6 应用场景 5.2.7 JDK 源码 - ...

  6. 《设计模式详解》结构型模式 - 代理模式

    代理模式 5.1 代理模式 5.1.1 概述 5.1.2 结构 5.1.3 静态代理 5.1.4 动态代理 JDK 动态代理 JDK 动态代理分析 CGLIB 动态代理 5.1.5 三种代理的对比 5 ...

  7. 设计模式(四)结构型模式

    前言 结构型设计模式,主要研究: 主要有哪些场景使用结构型设计模式: 每种场景应该使用何种设计模式: 以程序中的功能为核心,研究程序功能的组织结构.所以这一章,我们要把"功能结构" ...

  8. 设计模式(2)结构型模式

    结构型模式 结构型模式介绍如何将对象和类组装成较大的结构, 并同时保持结构的灵活和高效. 结构型模式: 适配器模式:用来把一个接口转化成另一个接口.使得原本由于接口不兼容而不能一起工作的那些类可以在一 ...

  9. 代码精进之路-设计模式-(二)结构型模式

    二.结构型模式(7个) 1.适配器模式 //针对的是已经存在的组件或者系统,而你也有自己的接口规范,你不想去依赖对方的接口, //这时候用适配器模式比较合适,用自己接口的一个实现去依赖对方的接口并做兼 ...

  10. 软件设计模式--第三章 结构型模式--享元模式

    目录 第二章 结构型模式 1.结构型模式概述 2.享元模式 (1)模式的定义与特点 (2)模式的结构与实现(Flyweight ) (3)应用场景 (4)扩展 第二章 结构型模式 1.结构型模式概述 ...

最新文章

  1. 【ACM】杭电OJ 2036(待更)
  2. 第58件事 借势文案创作实例
  3. Cambridge Judge Business school faculty review
  4. eval函数pythonmopn_python3中的 eval函数
  5. 象棋python代码_python象棋_python 象棋_python象棋源码 - 云+社区 - 腾讯云
  6. WSL:vi 的使用、只读下的修改操作
  7. 下载网页中的html5视频之手动方法
  8. word2007自动生成目录
  9. 再生核希尔伯特空间和核方法
  10. 视频、音频格式转换全集
  11. 基于RGMII的FPGA千兆以太网设计
  12. freeswitch借助fail2ban屏蔽骚扰注册
  13. PAIRNORM : TACKLING OVERSMOOTHING IN GNNS
  14. leetcode第一题:滑雪问题
  15. HTML将某几个文字添加下划线 并标红
  16. ffmpeg获取音频信息
  17. 如何围绕某一轴(不是xyz)旋转——transform.RotateAround
  18. FTP上传或下载偶尔出现文件为空
  19. OSChina 周五乱弹 ——程序员脱单攻略!
  20. 诙谐幽默的个性自我介绍

热门文章

  1. window.print()
  2. 正则表达式替换文本前n字符
  3. java 判断是合法语言_使用Java 怎么实现一个判断IP地址是否合法的功能
  4. netlink 0010 -- Generic Netlink 实现通信
  5. vs2012配置opengl提示error lnk
  6. java treeset 删除_删除Java TreeSet中的最低元素
  7. 1.2.1 Milking Cows 挤牛奶
  8. Trie树讲解(例题:ACWING 835,ACWING 143)
  9. php如何使用memcached,PHP如何使用Memcached_PHP
  10. ASP.NET---操作数据库增删改查