参考的博客:http://blog.csdn.net/wangeen/article/details/8272501

最近又把设计模式翻了一边,写个个人总结,这个总结比较简单,主要是一些理解,对于他们的实现和应用以后再总结

设计模式是编程抽象化的一个具体的应用,它让程序更好的阅读和理解,逻辑上更加合理,是通向更大规模软件的一个基础,换个说法,如果一个软件的模式很混乱那么它混乱到一定的程度就再也编写和维护不下去了,一直觉得Java c#的设计模式体现得更好,这是因为和他们的一切都是对象的理念比较一致,c++的稍微少一些,但是同样重要。

设计模式在大体上分3种

1. 如何构造对象而采用的模式(creational pattern)

2. 对象本身如何进行组织优化的模式(structure pattern)

3. 对象之间的行为如何管理的模式(behavioral pattern)

creational pattern主要有如下几个帮助构造对象的pattern,

1. abstract factory,  一个抽象工厂类可以派生出很多具体的工厂类;一个抽象产品类可以派生出很多具体的产品类;

其核心就是创建很多的product对象,然后在用一个factory对象里面构造很多createProduct的方法,使用起来也很简单,就是调用这一系列的create function,隐藏了对具体的对象的new, 另外factory通常都是singleton, 这个模式还有一个顺带的好处就是可以很方便的切换不同的product family, 这个模式使用可以提高程序的观感和可读性,一个文件的list对所有的对象的创建都包含了。

2. builder, 把复杂对象的构造和表示分离,所谓的构造就是builder中的一系列的method,这个pattern在anuvad中用得很好, 这个模式其实和abstract factory很类似,区别就是这里把一个复杂的对象分成好多step来构造,而abstract factory是一系列的小对象,也就是这里的step相当于那里product family中的一个。

3. factory method, 一个工厂类根据传入的参数创建对应的产品类;

就是提供一些method来创建具体的对象,常用的比如创建一个default的对象,或者根据一个id来决定来用哪个method。

4. prototype,通过copy一些具体的对象实例来构造新对象,是一种相对实例化的结构,注意每个product都要实现copy function,这个模式的理解还不透彻。

5. singleton:全局代码之间只有一个实例,需要做好保护。

structure pattern主要有如下几种优化组织结构的方法。

1.  adaptor,就是用多重继承的方式让一个已有的对象能支持别的对象的接口。

2. bridge, 就是将一个对象拆成两个,一个是abstraction(比较稳定的部分接口面对客户),另一个是implementation, QT当中有很多这样的pattern

3. composite, 就是一个对象,包含了一个对本身的list,这样就构成了一个tree, 然后对要用的函数对这个list进行实现,对于单个和整体的处理可以用统一的接口,此pattern和chain of reponsibility关联很紧。

4. decorator, 对已有对象构造一个decorator,然后继承这个对象扩展一些功能, B= decorator(A),那么B具有了A和扩展的一些功能。

5. facade, 对应用库提供了一些更高层次的接口的抽象,提供更简单的接口,这个模式的理解还不透彻。

6. flyweight, 对大量的重复使用的对象缓存,建立一个map, 当要使用的时候先查看有没有有就不要创建了,http://supercrsky.iteye.com/blog/372714

7. proxy, 对一个已有的class再次封装,控制对这个对象的访问,和decorator很类似,但是一个是扩展功能,一个是限制,实现很类似但是更多的是架构上的不一致

behavioral pattern, 描述了对象之间的行为,其封装的核心即行为本身也可以是对象

1. chain of responsibility 所有的class 都继承同一个动作,每一个class都对同一个动作作出响应,比如打印log, 一个接一个,用起来很方便

2. command, 把action作为一个对象,里面有一个要处理的对象的指针,可以用来纪录操作和(re)do

3. interpreter, 打造自己的语言解释器,每一个语法作为一个对象

4. iterator, stl里面有实现,用起来真的很方便

5. mediator, 构造一个class,可以将子class的变动相互通知,比如GUI中的组合控件

6. memento, 本质就是一个保存瞬时状态的structure, 可以进行还原, 和command一起使用来实现redo功能

7. observer, MVC架构实现的核心pattern, 和mediator很相似,只是这个一对多,另一个是任意组合。

8. state, 传说中的状态机, 最常见的例子是TCP的状态的转换,用户只要面对一个简单的接口,每个状态是一个class, 所有的状态的转换都在各个class内自动完成。

9. strategy, 把算法分装成对象,A=new B(算法 N)

10. template method, 把算法切割很几步,把其中几步退化(defer)到子class中去做

11.  vistor,构造一个vistor对象, 每个对象在vistor中都有一个对应的函数, vistor和对象相互耦合,不改变原来对象就可以访问它

E::accept(V&v){v.vE(this)};

boost中有一些设计模式的模板,比如abstract factory, 按照他们的说法就是abstract factory有很多冗余的代码,用template会很简单,另外还有flyweight, 设计得比较好作为一种allocate和其他的stl容器配合使用非常方便,也很节省内存,另外model c++里面用template的policy和traits来实现了很多的设计模式,这有个好处就是一次设计永远有用。

设计模式的理解的总结相关推荐

  1. 设计模式(个人理解)

    设计模式(个人理解) 工厂模式: 应用实例:一个工厂有一条流水线可以生产不同的产品,当客户需要某个产品时,直接告诉工厂产品名称.工厂就会用流水线生产对应的产品.客户不用关心产品时如何生产出来的,只需要 ...

  2. 23种设计模式通俗理解

    23种设计模式通俗理解 1.根据目的来分 2.根据作用范围来分 3.GoF的23种设计模式的功能 1.FACTORY 工厂方法 2.BUILDER建造者模式 3.FACTORY METHOD抽象工厂 ...

  3. Java查漏补缺(08)关键字:static、单例设计模式、理解main方法、类的成员之四:代码块、final关键字、抽象类、接口、内部类、枚举类、注解、包装类

    Java查漏补缺(08)关键字:static.单例设计模式.理解main方法.类的成员之四:代码块.final关键字.抽象类.接口.内部类.枚举类.注解.包装类 本章专题与脉络 1. 关键字:stat ...

  4. 设计模式的理解:对23个设计模式的总结

    设计模式名 ,链接可用 文档可下载:https://download.csdn.net/download/superSmart_Dong/16625368   设计模式 意图 适用的场景 关键实现过程 ...

  5. 构架、框架和设计模式的理解

    一个 架构师 构架了一个框架,约束框架使用者只能使用规定的结构来进行二次开发. 架构是指软件结构的专用名词,构架只是架构的另一种叫法. 框架是半成品.典型地,框架是系统或子系统的半成品. 1.设计模式 ...

  6. 设计模式|理解单一职责原则

    软件质量保障 专注测试圈,自动化测试.测试平台开发.测试新技术.大厂测试岗面经分享, 可以帮忙内推BATJ等大厂!欢迎加VX沟通交流: ISTE1024 很早想总结一些关于设计模式的文章了,回头看一下 ...

  7. php设计模式自我理解

    什么是php的设计模式? 设计模式?听起来很高大上的感觉,有一些做PHP开发一两年的同学,当有人问起他什么是php的设计模式时,他可能会说出几种常见的设计模式,例如:单例模式.工厂方法模式.建造者模式 ...

  8. 设计模式的理解与举例

    设计模式介绍 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的. 设计模式是一套被反复使用的.多数人知晓的.经过 ...

  9. java设计模式深度理解分析

    java设计模式 此篇博客是在疫情期间,一直没有开学,认识到了设计模式的重要性,然后通过上网课和自己收集资料认真学习了java的设计模式,然后将其中重要的概念,类图和代码整理了一下,以便以后的查阅,共 ...

最新文章

  1. cad加载tiff影像插件_设计大神CAD常用的七个插件你会用几个?
  2. 在C#代码中执行BCS外部内容类型方法
  3. 从浪漫走向坚韧:开源数据库的演变
  4. linux 查看权限命令行,【linux】与 用户、权限 有关的常用命令
  5. android 8.1.0怎么截屏,vivo Z1i怎么截屏?4种vivo Z1i截图方法
  6. CentOS 6.5使用本地光盘做yum源
  7. Unix/Linux环境C编程入门教程(20) 搭建基于Mac的 Xcode 与 QT 开发环境
  8. L2-003 月饼 (25 point(s))
  9. Java中StringBuffer类的常用方法
  10. 解决 手机能连接上wifi而电脑却却不能连接上wifi的情况
  11. STL之vector的push_back过程详解
  12. clickhouse开窗函数之同比环比
  13. Java联网3D坦克大战(网络编程)
  14. ERTEC200P-2 PROFINET设备完全开发手册(9-2)
  15. 路由器界面html模板,前端路由一探
  16. 【PCB开源分享】STC32G12K128/STC8H8K64U开发板
  17. Oracle环境变量NLS_LANG
  18. SIGIR 2021 | FSCD-PreRank:面向效率和效果更加均衡的交互式粗排模型
  19. 精解PCI Express---基础篇
  20. ipmDraw——化学结构编辑器

热门文章

  1. oracle创建表空间和用户授权
  2. 收集整理的非常有用的PHP函数
  3. iOS UI-AlertView(警示框)和ActionSheet(选择框、操作表单)
  4. 由马化腾谈“微博修改功能”,看什么是优秀的产品经理
  5. Java中BufferedReader和InputStreamReader
  6. 有了二叉查找树、平衡树为啥还需要红黑树?
  7. PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilder
  8. java poi 设置标题_poi生成Word时指定文本样式,如“正文”,“标题1”,“标题2”等...
  9. java中的多线程有什么意义_Java多线程与并发面试题(小结)
  10. 【Django】数据库主从配置