1 什么是设计模式

设计模式是对在软件设计过程中重复出现的问题提出了一种比较好的解决方案。正如一位专家所说:设计模式是对程序设计人员经常遇到的设计问题的可再现的解决方案(The Smalltalk Companion)。GOF设计模式通常被认为是其他设计模式的基础,随着业务复杂度的增大,会不断涌现新的设计模式,而这些新的设计模式一般会以GOF模式理论为参照。

2 为什么要学习设计模式

从个人职业规划来考虑。一位软件开发工程师随着编码量的增加,开发经验的增加,软件理论理解的加深,会不由自主地想一些方法或者捷径,来提高自己的生产率,而不是面对重复的问题做相同的工作,当你有这种想法的时候,就需要开始学习设计模式,设计模式会给你一些比较好的解决方案,不但解决了问题也提升了自己的能力,同时也是迈向软件设计师和架构师的过度阶段。

从软件架构的角度来考虑。经济的快速发展造就了业务越来越复杂,那么如何使软件适应这种复杂的业务变化,在软件设计和架构时,适当地使用设计模式可以解决此问题,也要注意不要过度使用设计模式,否则会使系统变的更加复杂。设计模式也是代码重构的依据和工具,建议在代码的重构时,尽量融入设计模式。

3 设计模式原则

使用设计模式的根本原因是适用变化,提高代码复用率,使软件更具有可维护性和可扩展性。需要遵循以下几个原则:单一职责原色、开放封闭原则(Open Closed Principal)、依赖倒置原则、里氏代换原则。

3.1单一职责原则

就一个类而言,应该只有一个引起他变化的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会消弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭受到意想不到的破会。

3.2开放封闭原则

软件实体(类、模块、函数等)应该可以扩展,但不可以修改。也就是说对扩展是开放的,对修改是封闭的。一般来说,面对需求,对程序的改动是通过添加新代码进行的,而不是更改现有代码。

3.3依赖倒置原则

抽象不应该以来细节,细节应该依赖抽象,也就是提倡的“面对接口编程,而不是面对实现编程”。也可以这样理解:高层模块不应该依赖底层模块,两个都应该抽象;抽象不应该依赖细节,细节应该依赖抽象。

3.4里氏代换原则

子类必须能够替换掉他们的父类型。也就是说,在软件开发过程中,子类替换掉父类,程序的功能行为没有变化。只有当子类可以替换掉父类,软件单位的功能不受到影响时,父类才能真正被复用,而子类也可以在父类的基础上增加新的行为。

4 设计模式四个基本要素

设计模式使人们可以更加简单方便地复用成功的设计和体系结构,将已证实的技术表述成设计模式也会使新加入的系统开发者更加容易理解其设计思路。设计模式的基本要素包括模式名称、问题、解决方案和效果。

4.1模式名称

一个助记名称,用来描述设计模式、解决方案和效果。设计模式允许在较高的抽象层次上进行设计。基于一个模式词汇表,开发团队之间可以讨论模式并在编写文档时使用它们。模式名称可以帮助我们思考,便于团队成员交流设计思想及设计结果。找到合适的模式名称也是设计模式编目工作的难点之一。

4.2问题

问题主要描述在何时使用设计模式。它解释了设计问题和问题存在的前因后果、特定的设计问题和怎样用对象表示算法等。通常情况下,模式必须满足的一系列先决条件是问题。

4.3解决方案

解决方案描述了设计的组成成分、它们之间的相互关系及各自的职责和协作方式。因为模式就像一个模板,可应用于多种不同场合,所以解决方案并不描述一个特定具体的设计或实现,而是提供设计问题的抽象描述和怎样用一个具有一般意义的元素组合(类或对象组合)来解决这个问题。

4.4效果

描述了模式应用的效果及使用模式权衡的问题。尽管描述设计决策时,并不是总提到模式效果,但它们对于评价设计选择和理解使用模式的代价及优势具有重要意义。软件效果大多关注对时间和空间的衡量,它们也表述了语言和实现问题。因为复用是面向对象设计的要素之一,所以模式效果包括它对系统灵活性、扩充性或可移植性的影响,显式地列出这些效果对理解和评价这些模式很有帮助。

5 设计模式分类

设计模式主要分为创建性模式( Creational Patterns)、结构性模式(Structural Patterns)、行为性模式(Behavioral Patterns)。

5.1创建性模式( Creational Patterns)

5.1.1 Net设计模式实例之简单工厂模式(Simple Factory Pattern)

简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖

5.1.2 Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)

抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类。抽象工厂模式的典型应用就是,使用抽象工厂+反射+配置文件实现数据访问层程序

5.1.3Net设计模式实例之单例模式( Singleton Pattern)

单例模式(Singleton Pattern),保证一个类只有一个实例,并提供一个访问它的全局访问点。单例模式因为Singleton封装它的唯一实例,它就可以严格地控制客户怎样访问它以及何时访问它。

5.1.4 Net设计模式实例之建造者模式(Builder Pattern)

建造者模式(Builder Pattern),将一个复杂对象的构建与它的表示分离,使的同样的构建过程可以创建不同的表示。建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及他们的装配方式时适用的模式

5.1.5 Net设计模式实例之原型模式( Prototype Pattern)

原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。Specify the kind of objects to create using a prototypical instance, and create new objects by copying this prototype。

浅复制与深复制区别:

浅复制,被复制的所有变量都还有与原来对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。深复制,把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。

Net命名空间System提供了一个IConeable接口,此接口只有一个方法Clone(),只需要实现这个接口就可以实现原型模式(Prototype Pattern)了

5.2结构性模式(Structural Patterns)

5.2.1Net设计模式实例之适配器模式(Adapter Pattern)

适配器模式,将一个类装换成客户期望的另外一个接口。Adapter模式统一了不兼容对象的接口,使的原本由于接口不兼容而不能工作的那些类可以一起工作。

5.2.2 Net设计模式实例之桥接模式( Bridge Pattern)

桥接模式(Bridge Pattern),将抽象部分与它的实现部分分离,使的抽象和实现都可以独立地变化。Decouple an abstraction from its implementation so that the two can vary independently.。

什么是聚合/组合:

聚合(Aggregation),当对象A被加入到对象B中,成为对象B的组成部分时,对象B和对象A之间为聚合关系。聚合是关联关系的一种,是较强的关联关系,强调的是整体与部分之间的关系。

5.2.3Net设计模式实例之组合模式(Composite Pattern)

组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。解决整合与部分可以被一致对待问题。

5.2.4 Net设计模式实例之装饰者模式(Decorator Pattern)

装饰模式,给一个对象动态添加额外职责,这些职责需要由用户决定加入的方式和时机。装饰模式提供了“即插即用”的方式,在运行期间决定何时增加何种功能。就增加功能来说,装饰模式比生成子类更加灵活。

5.2.5 Net设计模式实例之外观模式(Façade Pattern)

外观模式,为子系统的一组接口提供一个统一的界面,此模式定义了一个高层接口,这一个高层接口使的子系统更加容易使用。外观模式可以解决层结构分离、降低系统耦合度和为新旧系统交互提供接口功能。

5.2.6 Net设计模式实例之享元模式( Flyweight Pattern)

享元模式(Flyweight Pattern),运用共享技术有效支持大量细粒度的对象。Use sharing to support large numbers of fine-grained objects efficiently. 享元模式可以避免大量非常相似类的开销。在程序设计中有时需要生成大量细粒度的类实例来表示数据。如果发现这些实例除了几个参数外基本伤都是相同的,有时就能够受大幅度第减少需要实例化的类的数量。如果能把这些参数移到类实例外面,在方法调用时将他们传递进来,就可以通过共享大幅度地减少单个实例的数目。

享元对象的内部状态与外部状态:

内部状态,在享元对象的内部并且不会随环境改变而改变的共享部分。

外部状态,随环境改变而改变的,不可以共享的状态。

5.2.7 Net设计模式实例之代理模式(Proxy Pattern)

代理模式(Proxy Pattern)对其他对象提供一种代理以控制对这个对象的访问。

5.3行为性模式(Behavioral Patterns)

Net设计模式实例之职责链模式(Chain Of Responsibility)

后期补此节

5.3.1Net设计模式实例之命令模式(Command Pattern)

命令模式(Command Pattern)将请求封装为一个对象,从而使你用不同的请求对客户进行参数化,对请求排队或纪录请求日志,以及支持可撤销的操作。当需要有撤销或者恢复操作时,可以考虑使用命令模式.

5.3.2Net设计模式实例之解释器模式(Interpreter Pattern)

解释器模式(Interpreter Pattern),给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。当有一个语言需要解释执行,并且你可将该语言中的句子表示为一个抽象的语法树时,可以考虑使用解释器模式。

5.3.3 Net设计模式实例之迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern),提供一种方法顺序访问一个聚合对象中元素,而不暴露改集合对象的内部表示。迭代器模式就是分离了集合对想的遍历行为,抽象出一个迭代器类来负责,这样即可以不暴露集合的内部机构,又可让外部代码透明地访问集合内部的数据.

5.3.4 Net设计模式实例之中介者模式(Mediator Pattern)

中介者模式(Mediator Pattern),定义一个中介对象来封装系列对象之间的交互。中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互。中介者模式一般应用于一组对象以定义良好但是复杂的方法进行通信的场合,以及想定制一个分布在多个类中的行为,而不想生成太多的子类的场合.

5.3.5 Net设计模式实例之备忘录模式(Memento Pattern)

备忘录模式(Memento Pattern),在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以就该对象恢复到原先保存的状态。

当系统功能比较复杂,而且需要记录历史属性以便当需要时做恢复动作。Originator可以根据保存的Memento信息还原到前一状态。

5.3.6Net设计模式实例之观察者模式(Observer Pattern)

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化的时,会通知所有观察者对象,使他们能够自动更新自己。解决的是“当一个对象的改变需要同时改变其他对象的时候”问题。最后以股票实例进一步阐述了观察者模式。

5.3.7Net设计模式实例之状态模式(State Pattern)

状态模式(State Pattern),当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。当一个对象行为取决于它的状态,并且它必须在运行时刻根据状态改变它的行为时,就可以考虑使用状态模式了.

Net设计模式实例之策略模式(Strategy Pattern)

后期补此节

5.3.8Net设计模式实例之模板方法模式(Template Mothed Pattern)

模板方法模式(Template Method Pattern),定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可以重定义算法的某些特定步骤。模板方法模式把不变行为搬移到超类,从而去除子类中的重复代码,实际上模板方法模式就是提供了一个代码复用平台。

要完成在某一细节上层次一致的一个过程或一系列步骤,但个别步骤在更详细的层次上实现不同时,可以使用模版方法模式解决问题。

 

5.3.9Net设计模式实例之访问者模式(Visitor Pattern)

访问者模式表示一个作用于某对象结构中的个元素操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 访问者模式的目的是要把处理从数据结构分离出来

6 设计模式总结

Net设计模式系列文章介绍了GOF 23个模式,从模式的设计理念、设计框架、框架的代码介绍了设计模式,并且每个模式配有模式实例,UML设计及其C#代码。使用的设计工具是EA:Enterprise Architect.主要参考的书籍有《Head First 设计模式》《大话设计模式》《Net与设计模式》《C# 3.0 Design Pattern》及其国外一些文章的实例,在此对这些书的作者感谢,在阅读此系列文章之前,建议大家先阅读《UML建模系列文章总结》

至此,Net设计模式实例系列文章已经写完,由于个人能力有限,不免有些问题阐述的不清楚或者不是非常正确,望高手指点。再此感谢

转载自:http://www.cnblogs.com/ywqu/archive/2010/03/15/1686015.html

Net设计模式实例系列文章总结的更多相关文章

  1. C#设计模式(0)-设计模式系列文章导航

    设计模式系列文章导航  C#设计模式(1)——单例模式(SingletonPattern) C#设计模式(2)——简单工厂模式(SimpleFactory)    C#设计模式(3)——工厂方法模式( ...

  2. 无废话C#设计模式系列文章

    不错的系列文章 原文:http://www.cnblogs.com/lovecherry/archive/2007/10/17/927728.html 本系列文章从公司内部的知识分享修改而来,有错误或 ...

  3. IT软件人员的技术学习内容(写给技术迷茫中的你) - 项目管理系列文章

    前面笔者曾经写过一篇关于IT从业者的职业道路文章(见笔者文:IT从业者的职业道路(从程序员到部门经理) - 项目管理系列文章).然后有读者提建议说写写技术方面的路线,所以就有了本文.本文从初学者到思想 ...

  4. [转]领域驱动设计系列文章(2)——浅析VO、DTO、DO、PO的概念、区别和用处

    原文地址:http://www.blogjava.net/johnnylzb/archive/2010/05/27/321968.html 上一篇文章作为一个引子,说明了领域驱动设计的优势,从本篇文章 ...

  5. 领域驱动设计系列文章——浅析VO、DTO、DO、PO的概念、区别和用处

    本篇文章主要讨论一下我们经常会用到的一些对象:VO.DTO.DO和PO. 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: ...

  6. 领域驱动设计系列文章(2)——浅析VO、DTO、DO、PO的概念、区别和用处

    本篇文章主要讨论一下我们经常会用到的一些对象:VO.DTO.DO和PO. 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: ...

  7. 基于DDD的现代ASP.NET开发框架--ABP系列文章总目录

    ABP相关岗位招聘:给热爱.NET新技术和ABP框架的朋友带来一个高薪的工作机会 ABP交流会录像视频:ABP架构设计交流群-7月18日上海线下交流会的内容分享(有高清录像视频的链接) 代码自动生成: ...

  8. 【NLP】蓦然回首:谈谈学习模型的评估系列文章(一)

    统计角度窥视模型概念 作者:白宁超 2016年7月18日17:18:43 摘要:写本文的初衷源于基于HMM模型序列标注的一个实验,实验完成之后,迫切想知道采用的序列标注模型的好坏,有哪些指标可以度量. ...

  9. 如何实现一个php框架系列文章【开篇】

    1.本系列文章的目的 实现一个小而美的产品级别php框架 自己动手实现一个新框架仅用于学习交流,不打算替代市面上现有的其他主流框架. 2. 我要一个怎样的PHP框架 简单实用,安全优雅,博采众长 安装 ...

随机推荐

  1. (转载)H.264码流的RTP封包说明

    H.264的NALU,RTP封包说明(转自牛人) 2010-06-30 16:28 H.264 RTP payload 格式 H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) ...

  2. js表达式与语句的区别

    http://www.2ality.com/2012/09/expressions-vs-statements.html http://www.jb51.net/article/31298.htm 表 ...

  3. 《代码的未来》读书笔记:内存管理与GC那点事儿

    一.内存是有限的 近年来,我们的电脑内存都有好几个GB,也许你的电脑是4G,他的电脑是8G,公司服务器内存是32G或者64G.但是,无论内存容量有多大,总归不是无限的.实际上,随着内存容量的增加,软件 ...

  4. 给Macbook Pro更换固态硬盘并转移系统的最简单办法

    没有固态硬盘,再快的CPU,再强悍的显卡,都是白搭,由于“木桶原理”,瓶颈就在这里啊.如今的固态硬盘价格跌了很多,我记得去年我买的120G的固态硬盘还要将近600元,而现在只需要不到400了.   我 ...

  5. Some warning were found during validation

    前几天做一个iOS下的App更新,到上传的时候出了问题,一直传了大半个小时,结果还是没传完,再试依然不行,于是只好关机,把电脑带回家弄. 回家后出现了更奇怪的事,经过漫长等待后,竟然出现这个提示: 我 ...

  6. (源码下载)高灵活度,高适用性,高性能,轻量级的 ORM 实现

    我在上一篇博客中简单说明了一个面向内存数据集的“ORM”的实现方法,也提到我的设计实现或许不能称之为“ORM”,姑且称之为 S-ORM吧. 可能有些小伙伴没有理解我的思路和目的,与传统ORM框架做了简 ...

  7. Hibernate的三种状态及对象生命周期

        理解Hibernate的三种状态,更利于理解Hibernate的运行机制,这些可以让你在开发中对疑点问题的定位产生关键性的帮助. 三种状态 临时状态(Transient):在通过new关键字, ...

  8. MySQL实现嵌套集合模型

    MySQL实现嵌套集合模型 译文主要是介绍如何用MySQL来存储嵌套集合数据.在其中会增加一些自己的理解,也会删除掉一些自认为无用的废话. 这篇文章主要讲的是嵌套集合模型,所以邻接表不是本文的重点,简 ...

  9. ANDROID下面的游戏更新目录

    更新模块的整体方案终于搞定了,包括launcher的自更新,以及framework,app等代码的更新,均测试通过. 很激动地拿到ANDROID上去测试,一下就傻眼了. 在创建upd目录的时候,就遇上 ...

  10. android内部培训视频_第二节 布局基础

    第二节:布局入门 一.线性布局 需要掌握的属性: 1.orientation:排列方式 vertical:垂直 Horizontal:水平 2.weight:水平布局的权重 3.gravity:子控件 ...