现在的位置: 首页 > 综合 > 正文

Net设计模式实例系列文章总结

2013年04月02日 ⁄ 综合 ⁄ 共 4199字 ⁄ 字号 评论关闭

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.3 Net设计模式实例之单例模式( 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.1 Net设计模式实例之适配器模式(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)将请求封装为一个对象,从而使你用不同的请求对客户进行参数化,对请求排队或纪录请求日志,以及支持可撤销的操作。当需要有撤销或者恢复操作时,可以考虑使用命令模式

抱歉!评论已关闭.