[一]设计模式初探

模式,顾名思义,就是做一种事情的方法归纳,就经验来说,做什么事情有个好的方法来应对都是可以事半功倍的,在软件开发中何谓好的模式?

我认为好的模式简单来说就是保证你应对需求变化的时候不用做更多的代码修改,而只需要在原有的基础上进行扩充,也就是所谓的”关闭修改,开放扩展。“

要做到这一点,系统模块之间的关系绝对不能过于紧密,过于紧密的结果就是,当你一个模块需要修改,另外一个模块也需要做相应的修改,这样,我们软件开发的成本就加大了,甚至完全适应不了新的需求,这是非常糟糕的。所以,我们在系统架构的设计上一定要做到低耦合(考虑可能的需求变化,任何复杂的设计都是有代价的,在没有必要做特殊处理的地方都刻意做得很复杂,系统的效率可能会非常低下,这一点在理解了.NET调用虚函数等机制后会有所了解)。假如你满足了低耦合的条件,一般情况也说明你的系统内聚性比较高(类的责任清晰)。经典的设计模式就是让我们构建具有此特性系统架构的方法。

今天,我稍微归纳一下几个设计模式的功能:

1.策略模式:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。

2.观察者模式:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。

3.动态地将责任附加到对象上。想要扩展功能,装饰者提供有别于继承的另一种选择。

4.抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

5.工厂方法模式:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。

6.单件模式:确保一个类只有一个实例,却提供全局访问点。

7.命令模式:将请求封装成对象,这可以让你使用不同的请求,队列,或者日志请求来参数化其他对象。命令模式也可以支持撤销操作。

8.适配器模式:将一个类的接口转换成客户端期望另一个接口。

9.外观模式:提供另一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

10.模板方法:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

11.迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

12.组合模式:允许你将对象组成树形结构来表现“整体/部分”的层次结构。组合能让客户以一直的方式处理个别对象和对象组合。

13.状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

14.代理模式:为另一个对象提供一个替身或站位符以访问这个对象。

15.复合模式:复合模式结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题。

 

学习设计模式时间并不长,感觉这门学问在软件开发中的地位是相当重要的,作为一个初级开发人员,我觉得学习它很有必要的,特别是在看别人的代码时候,我们可以知其然,更知其所以然,这对程序员的提高是相当有帮助的,呵呵。

转载于:https://www.cnblogs.com/nero/archive/2010/08/30/1812814.html

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

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

相关文章

Gentoo - ssh-agent配置

现在使用类似github这样的service&#xff0c;一般来说都会配置ssh key认证。所以使用ssh-agent来管理私钥就变的必要。在Gentoo下是这么配置的&#xff1a;- sudo emerge -avt keychain- 编辑.bashrc&#xff0c;加入keychain <private key 1 path> ... <private key…

java 方法 示例_Java ArrayDeque offerFirst()方法与示例

java 方法 示例ArrayDeque类offerFirst()方法 (ArrayDeque Class offerFirst() method) offerFirst() Method is available in java.lang package. offerFirst()方法在java.lang包中可用。 offerFirst() Method is used to add the given element at the front of this deque. …

平院Python习题

在读写文件之前&#xff0c;用于创建文件对象的函数是&#xff08; A &#xff09;。 A&#xff0e; open B&#xff0e; create C&#xff0e; file D&#xff0e;folder 解析&#xff1a; open(file, mode‘r’, buffering-1, encodingNone, errorsNone, newlineNone, close…

搭建srs服务器(rtmp)

搭建srs服务器&#xff08;rtmp&#xff09; 目录:1、下载srs源码&#xff08;从码云上&#xff09;&#xff1a;2、 切换到srs.oschina&#xff1a;3、 这里使用3.0版本&#xff1a;4、 切换到trunk&#xff1a;5、 编译&#xff1a;6、 启动&#xff1a;7、查看日志输出&…

MOSS信息管理策略定制(MOSS custom policies)

MOSS引入了信息管理策略&#xff0c;通过给文档库或列表附加一些策略可以实现一些自动化的功能&#xff0c;如自动给文档打标签&#xff0c;强制文档的审核&#xff0c;启用文档的过期&#xff0c;甚至可以在用户打印文档时插入条形码。难么&#xff0c;这么好用的功能是怎么实…

2560介绍_炒股高手收益翻10倍,只因妙用这一招2560战法,看了都不亏了

(本文由公众号越声研究(yslc927yj)整理&#xff0c;仅供参考&#xff0c;不构成操作建议。如自行操作&#xff0c;注意仓位控制和风险自负。)选股是每个刚入市的新股民需掌握的技巧&#xff0c;通过资金选股了解资金流向&#xff0c;善用工具轻松选股&#xff0c;同时多留意行业…

二进制搜索树_将排序的数组转换为二进制搜索树

二进制搜索树Problem statement: 问题陈述&#xff1a; Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 给定一个数组&#xff0c;其中元素按升序排序&#xff0c;请将其转换为高度平衡的BST。 For this problem, a he…

rtmp协议分析(三次握手)

RTMP详细分析(Message 消息&#xff0c;Chunk分块) librtmp分析&#xff08;发送数据包处理&#xff09; librtmp分析&#xff08;接收数据包处理&#xff09; RTMP协议是Real Time Message Protocol(实时信息传输协议)的缩写&#xff0c;它是由Adobe公司提出的一种应 用层的协…

OpenAPI系列: 六、OpenAPI策略分析

一、如何注册 为什么要注册&#xff1f;访问 OpenAPI必须拥有Consumer Key和Consumer Secret。 如何注册&#xff1f;要获取Consumer Key及Consumer Secret&#xff0c;需要消费方&#xff08;Consumer&#xff09;向服务提供方申请注册&#xff0c;服务提供方审核通过后会向消…

压缩、解压 解决 客户端查询大批量数据时等待时间过长的问题

在项目中查询时&#xff0c;因数据量大&#xff0c;导致网络传输很慢&#xff0c;这就需要在服务器端查询出的数据进行压缩处理&#xff0c;后传输完了在客户端进行解压处理&#xff08;此为在Silverlight中压缩与解压&#xff09;&#xff1b; 具体方法如下&#xff1a; using…

C---已知正整数n是两个不同的质数的乘积,试求出较大的那个质数。

已知正整数n是两个不同的质数的乘积&#xff0c;试求出较大的那个质数。 思路&#xff1a;由题意可知&#xff0c;n为两个质数之积&#xff0c;也就是说只要找到一个数能够被n整除&#xff0c;这个数一定是质数&#xff01;&#xff01;&#xff01;2为最小的质数&#xff0c;…

isnumeric_Python字符串| isnumeric()方法与示例

isnumericisnumeric() is an in-built method in Python, which is used to check whether a string contains only numeric values or not. isnumeric()是Python中的内置方法&#xff0c;用于检查字符串是否仅包含数字值。 Numeric contain all decimal characters and the f…

合并文件夹中子目录_01 Linux之统计文件夹中文件个数以及目录个数

案例分析&#xff1a;今天遇到了一个需要统计路径下目录个数的问题如果一个一个的去数会很麻烦&#xff0c;找到了一篇文章刚好提到这个&#xff0c;于是我将方法整理了一下。该方法的链接&#xff1a;Linux统计文件夹中文件个数以及目录个数_SG匚hang的博客-CSDN博客_linux统计…

关于Makefile,Makefile.in,Makefile.am,Configure功能及相互关系的问题

目录makefile写法1. 简介2. 上路之前3. 一个简单的例子4.说明&#xff1a;4.1、autoscan4.2、 configure.scan4.3、aclocal4.4、autoconf4.5、Makefile.am4.6、 automake4.7、Makefilemakefile写法 在 Unix 上写程式的人大概都碰过 Makefile&#xff0c;尤其是用 C 来开发程式…

修改主键的SQL

declare defname varchar(100)declare cmd varchar(500)declare tablename varchar(100)declare keyname varchar(100) Set tablenameTemp1Set keynameid --需要設置的key,分隔 select defname name FROM sysobjects so JOIN sysconstraints sc ON so.id sc.constid …

西安理工大学863(转载)

原创&#xff1a;https://blog.csdn.net/mzj15101229871/article/details/107613162 &#xff08;博主总结的很完整&#xff0c;很厉害&#xff0c;本人为了查看方便&#xff0c;才转载的。本人只是个小白~&#xff09; 第一章 绪论 考试大纲 1&#xff09;了解数据元素、数…

原理简介_消息通信的利器MQTT协议简介及协议原理

- 没用过但是必须得知道系列 -前言&#xff1a;相比于 XMPP&#xff0c; MQTT 的简单轻量受到了不少工程师的喜爱&#xff0c;从物联网到传统的消息服务&#xff0c;简单可依赖的 MQTT 到底为何让人如此着迷呢&#xff1f;MQTT 协议&#xff0d;MQTT 协议简介及协议原理MQTT(Me…

stl vector 函数_vector :: pop_back()函数以及C ++ STL中的示例

stl vector 函数C vector :: pop_back()函数 (C vector::pop_back() function) vector::pop_back() is a library function of "vector" header, it is used to deletes an element from the end of the vector, it deletes the element from the back and returns …

rtmp协议分析(Message 消息,Chunk分块)

RTMP详细分析&#xff08;三次握手&#xff09; librtmp分析&#xff08;发送数据包处理&#xff09; librtmp分析&#xff08;接收数据包处理&#xff09; 目录1、Message(消息)2、Chunking(Message 分块)2.1、 Basic Header(基本的头信息)2.1.1、Basic Header为1个字节时2.1.…

【文摘】 雪念——作者:蓝色妖姬

引用原文地址&#xff1a;点我 我本是惆怅之人&#xff0c;拥有不了所谓的快乐&#xff0c;笔尖谱写不出唯美的风花雪月&#xff0c;只是流露这淡淡的疼痛&#xff0c;淡淡的哀伤。——蓝色妖姬。 喜欢雪&#xff0c;喜欢伫立在雪地里&#xff0c;凝视着片片雪花从眼前飘落。 心…