设计模式的理解的总结

参考的博客: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来实现了很多的设计模式,这有个好处就是一次设计永远有用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PID算法原理介绍

先来彻底搞懂PID到底是啥?PID,就是“比例(proportional)、积分(integral)、微分(differential)”,是一种很常见的控制算法。在工程实际中,应用最为广泛的调节…

将python代码编译成.so文件

https://moonlet.gitbooks.io/cython-document-zh_cn/content/ch1-basic_tutorial.html add_num.pyx文件 def add_nums(ls):total 0.for l in ls:total lreturn totalset_up.py from distutils.core import setup from Cython.Build import cythonizesetup(ext_modules cyth…

将iphone中的照片同步到电脑

在windows中: 去我的电脑,点iphone的图标,打开直接就是照片的文件夹,可以进行各种操作; 在mac中: 使用iphoto软件,选择iphoto的菜单栏中“iphoto”->"performance"->"gene…

雅虎公司C#笔试题

雅虎公司C#笔试题,包括问答题和选择题两部分。试试看,你能回答出多少题,可以通过雅虎的考试吗?Question 1. (单选)在计算机网络中,表征数据传输可靠性的指标是1. 传输率2. 误码率3. 信息容量4. 频带利用率Question 2. (单选)以下关…

打败opencv ,哦,是快了3倍

大家好,本文转自我一个读者朋友Homio的文章,推荐给大家,希望对做这方便的同学有所帮助。程序员,哦!不!软件工程师们都对opencv很熟悉,它在工作学习研究中起到了不可或缺的作用。但是它臃肿的身躯…

Linux内核裁减

Linux内核裁减 (1)安装新内核: i)将新内核copy到/usr/src下, #tar xzvf linux-2.6.38.4.tar.gz -----解压缩. ii) 将名为linux的符号链接删掉,这是旧版本内核的符号链接. #ln -s linux-2.6.38.4 linux ------建立linux-2.6.38.4的符号链接linux. &#x…

python 将一个字符list的列表扁平化成了一个list

a[[app,ap,ade],[er],[bcc,brt]] 将这么一个list 转换成 a2[app,ap,ade,er,bcc,brt] 做法:a2[x for tup in a for x in tup] 转载于:https://www.cnblogs.com/cheng-cheng/p/10027446.html

数据库中使用自增量字段与Guid字段作主键的性能对比(补充篇)-----转

我在发表过“据库中使用自增量字段与Guid字段主键的性能对比”这篇文章后,得到博客园各园友的很多评价,大家对我的测试方法也提出一些改进的方法。让我吃惊的是一园友提出:把guid和id的测试顺序颠倒一下,看下结果。今天就再测试一…

JDBC操作数据库就这八步!

1.載入JDBC驅動程式 內含於JDK中,名稱為"Sun.jdbc.odbc.JdbcOdbcDriver",可以使用"java.lang"套件下的 Class.forName()方法載入。 2.透過DriverManager類別建立Connection物件 於"java.sql"套件下可以運用到此JDBC API&a…

DEVC++出新版本了

昨天发了一篇文章C语言能判断一个变量是int还是float吗?然后有同学问我在Windows下是怎么写C代码的我是没有安装包的,只不过这个同学关系跟我不错,所以我就去找了下安装包,不找不知道,找了才发现,原来这个更…

iphone-common-codes-ccteam源代码 CCNSArray.h

//// CCNSArray.h// CCFC//// Created by xichen on 11-12-17.// Copyright 2011年 ccteam. All rights reserved.//#import <Foundation/Foundation.h>interface NSArray(cc)// 判断一个对象指针(不是对象的值)是否在数组中存在- (BOOL)isPointerExistsInArray:(id)…

TZOJ--1518: 星星点点 (二进制模拟)

1518: 星星点点 时间限制(普通/Java):1000MS/10000MS 内存限制:65536KByte 描述 输入一个由“*”和“.”组成的字符串&#xff0c;然后根据规则生成下一行字符串&#xff1a; 如果该行的第i和第i1个位置上的符号不同&#xff0c;则下一行的第i个位置上为“*”&#xff0c;…

关于反射的我的一些看法

关于反射的我的一些看法 最近因为项目的需要大量地使用了反射工厂,也看了大量的有关反射性能问题的讨论和各种测评.总的感觉是反射的性能太低,不适合在性能要求高的地方使用.但根据我多年的网站开发经验来看,一个WEB网站的性能关键一般只会是看数据表的设计是否合理,更进一步的…

EPOLL模型

最近在公司里面主要负责一些手机网络游戏的服务器端的编写。虽然接触时间不多&#xff0c;但是感触良多。特意将我此段时间的体会和大家分享。 以前公司的服务器都是使用HTTP连接&#xff0c;但是这样的话&#xff0c;在手机目前的网络情况下不但显得速度较慢&#xff0c;而且不…

小鹏汽车面试经验分享

大家周一好&#xff0c;这篇文章转自我的朋友李纳克斯&#xff0c;在做工作的同事&#xff0c;去面试也能增长自己的技术面和技术深度。推荐给大家&#xff0c;希望对大家有所帮助。某个下午&#xff0c;小鹏汽车的HR在招聘软件上撩我&#xff0c;于是我决定去聊聊看。接触下来…

(Bezier)贝塞尔曲在路径规划的运用,机器运动控制常用

前言之前被安排了活&#xff0c;一个局部区域机器运动控制的工作&#xff0c;大致是一个机器位于一个极限区域时候&#xff0c;机器要进入一个特殊的机制&#xff0c;使得机器可以安全的走出来。其中用到了bezier曲线进行优化路径&#xff0c;今天写一下&#xff0c;正好也给大…

IT部门绩效考核:一本糊涂账?

IT部门绩效考核&#xff1a;一本糊涂账&#xff1f; 作者&#xff1a; 三人行  来源&#xff1a;赛迪网 http://www.csai.cn 2005年11月02日 AMT-企业资源管理研究中心 高级顾问 姚磊 北京新华信管理顾问有限公司 顾问 宋炜 光明乳业信息总监 赵春雨 明基逐鹿人力资源咨询…

Spark安装

1 Spark安装地址 运行环境:CentOS 6.8 Hadoop 2.7.2JDK 1.8Scala 2.11.8Spark 2.1.1 集群以3台机器模拟:hadoop202 hadoop203 hadoop204 1&#xff0e;官网地址 http://spark.apache.org/ 2&#xff0e;文档查看地址 https://spark.apache.org/docs/2.1.1/ 3&#xff0e;下载地…

mysql开启慢查询日志及查询--windows

转载地址&#xff1a;http://blog.csdn.net/ljasdf123/article/details/9713523 MySQL慢查询配置 1. 慢查询有什么用? 它能记录下所有执行超过long_query_time时间的SQL语句, 帮你找到执行慢的SQL, 方便我们对这些SQL进行优化. 2. 如何开启慢查询? 首先我们先查看MYSQL服务器…

如何成为“10倍效率”开发者

导读&#xff1a;Brad Feld的一篇文章The Rise of Developeronomics中提到了“10倍效率的开发者&#xff08;10x developer&#xff09;”的概念&#xff08;伟大的开发者的效率往往比一般的开发者高很多&#xff0c;而不只是一点点&#xff09;&#xff0c;Adam Loving在读了之…