.NET中的设计模式

凡是涉及过设计模式的人都应该听过一些模式的名字,其中包括策略模式和状态模式.它们就是我今天要阐述的对象.之所以放在一起,是因为二者有某种关系可以帮助大家真正了解设计模式.为什么没有第三种,因为那样子太多了,说不清.

对于这两种模式官方的定义如下:

策略模式: 定义一系列算法,把它们一个个封装起来,并使它们能相互替换。使得算法可以独立于它的客户而变化。

状态模式: 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

这两个定义理解起来相当容易,二者大致可以概括为”对象根据不同的条件灵活选择不同的行为/方法”.这么看来策略模式和状态模式岂不是一样了?!现在看来确实是这么一回事.不过先别这么早的下结论,我们继续向下看.

这次看看二者的类图,如下:


图1.策略模式


图2.状态模式

这时候细心的人会发现这两种模式的UML类图完全一样.是不是觉得有点糊涂了?!这里先卖个关子,说点别的.

在平时大家学习设计模式的时候也许不会发现今天我给大家举出的情况,也不会觉得自己对设计模式的理解有什么不妥.不过你真的理解了吗?网上有很多关于设计模式的帖子,不管内容还是论调几乎都一样,随随便便的拿个例子或代码说明自己学会了设计模式.但是如果仔细比对,发现他们的内容几乎和教科书上一样,并且只包含其中的一部分.这样的结果是人云亦云,糊涂的继续糊涂,不懂得继续装懂.

好了,言归正传,回来继续说我们的策略模式和状态模式.通过上面说明,大家会发现不管从实现还是从设计,或者总结,二者几乎一模一样.那么二者真的是同一种模式吗?答案有两种,第一,是;第二不是.

答案一.”是”:是从某些开发或设计的角度看的,就像上面的过程.不过这只是表面现象;

答案二”不是”:很显然四人组比我们绝大多数人水平高的多,相比之下,我们出错的几率比他们高的多.那么这两种设计模式的区别到底在哪呢?

看过书大家都知道策略模式和状态模式都属于Gof23种设计模式中的行为模式.二者外表一样,只是二者的关注点不一样.策略模式关注行为的变化,状态模式关注对象状态的变化如何导致对象行为的变化.

策略模式中的两个角色:客户和策略.客户的职责是了解行为的差别,定义同一的接口.策略的职责是提供不同的实现,并根据客户的意图来选择.至于有多少种行为,一般很难知道,因为随着发展会有不同的变化加入.现实中一个简单的例子就是根据客户的要求选择不同的加密算法.当有新的加密算法出现时,客户需要知道这个变化,此时策略此可以灵活的选择使用新的算法.

状态模式一个形象的比喻是”饱了睡,饿了吃”.在这里”饱和饿”是两种状态,”睡和吃”是两种行为.另外一个典型的例子是银行账户.根据客户账户中余额的不同用户可以有不同的操作行为.这里要注意到,状态模式中状态与行为的对应关系.虽然不是一一对应,但潜藏了一些信息,那就是实际例子中行为与状态的有限和稳定,行为的唯一性.有限和稳定是指对象的行为一般就那几种,除非业务需求变动,否则不会发生改变.唯一性只是对象只有一个吃的行为,二不会有第二个吃的行为.

这时候策略模式与状态模式之间的区别就清楚了.

策略模式关注行为的变化,但归根结底只有一个行为,变化的只是行为的实现.客户不关注这些.当新增变化时对客户可以没有任何影响.

状态模式同样关注行为的变化,但这个变化是由状态来驱动,一般来说每个状态和行为都不同.新增的状态或行为一般与已有的不同,客户需要关注这些变化.

时间: 2024-10-26 05:52:44

.NET中的设计模式的相关文章

[Head First设计模式]饺子馆(冬至)中的设计模式——工厂模式

[Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式--建造者模式 引言 今天是冬至,去饺子馆吃饺子,看他们店里面的水饺种类挺多,在等待中,在想是不是可以用设计模式模拟一下,生产饺子的过程,正好最近也在看工厂模式,也就现学现卖了.当然,实现的方式很多,只是一个例子而已.祝大家冬至,多多吃水饺..... 对象创建的问题? 我们应该面向接口编程而不是面向实现编程,因

[Head First设计模式]餐馆中的设计模式——命令模式

系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式--建造者模式 [Head First设计模式]饺子馆(冬至)中的设计模式--工厂模式 [Head First设计模式]一个人的平安夜--单例模式 [Head First设计模式]抢票中的设计模式--代理模式 [Head First设计模式]面向对象的3特征5原则 [Head First设计模式]鸭子

[Head First设计模式]抢票中的设计模式——代理模式

原文:[Head First设计模式]抢票中的设计模式--代理模式  系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式--建造者模式 [Head First设计模式]饺子馆(冬至)中的设计模式--工厂模式 [Head First设计模式]一个人的平安夜--单例模式 引言 闲着没事,终于又拿起Head First设计模式 翻了翻,脑海里也一直在想抢票

软件行为模型中的设计模式

Discovering design patterns in software behavior models Sandeep Mitra and T. M. Rao Department of Computing Sciences The College at Brockport, State University of New York Brockport, NY 14420 585 395-2234 smitra@brockport.edu 探索软件行为模型中的设计模式 Sandeep M

[Head First设计模式]山西面馆中的设计模式——观察者模式

系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 引言 不知不自觉又将设计模式融入生活了,吃个饭也不得安生,也发现生活中的很多场景,都可以用设计模式来模拟.原来设计模式就在我身边. 为什么观察者模式会出现呢? 为了建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应做出反应.在此,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多个观察者,而且这些观察者之间没有相互联系,可以根据需要增加和删除观察者,使得系统

[Head First设计模式]山西面馆中的设计模式——建造者模式

系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 引言 将学习融入生活中,是件很happy的事情,不会感觉到累.一个感觉:很好玩!挺开心的...... 为什么会出现建造者模式? 在软件系统中,有时面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成. 这个复杂的对象的各个部分经常面临剧烈变化,但是将它们组合在一起的算法却相对稳定. 比如:建一所房子,建房子的过程基本不变

请问这是java中的设计模式吗?

问题描述 请问这是java中的设计模式吗? 请问下面的代码属于什么设计?为什么把set方法改成那样子 public class A{ private Integer num; private String min; public Integer gerNum(){ return num; } public A num(Integer num){ this.num = num; return this; } public String getMin(){ return min; } public

Android中的设计模式

一般来说,常用的设计模式有以下八种:单例.工厂.观察者.代理.命令.适配器.合成.访问者 单例模式:目的是为了让系统中只有一个调用对象,缺点是单例使其他程序过分依赖它,而且不同单例运行在不同进程中,使得维护困难: 工厂模式:生产固定的一些东西,如抽象类,缺点是产品修改麻烦:如喜欢动作片和爱情片的人分别向服务器发出同一个请求,就可以得到他们想看的影片集,相当于不同对象进行同一请求,需求均得到满足. 观察者模式:就是多个对象对一个对象进行监控,如缓存: 代理模式:自己的事交给别人去做,分别返回结果即

在Java中应用设计模式--Factory Method

设计 在设计模式中,Factory Method也是比较简单的一个,但应用非常广泛,EJB,RMI,COM,CORBA,Swing中都可以看到此模式的影子,它是最重要的模式之一.在很多地方我们都会看到xxxFactory这样命名的类,那么,什么是Factory Method,为什么要用这个模式,如何用Java语言来实现该模式,这就是本文想要带给大家的内容. 基本概念 Factory Method是一种创建性模式,它定义了一个创建对象的接口,但是却让子类来决定具体实例化哪一个类.当一个类无法预料要

在Java中应用设计模式--Singleton

设计 本文介绍了设计模式中 Singleton 的基本概念,对其功能和用途进行了简单的分析,列出了通常实现 Singleton 的几种方法,并给出了详细的Java 代码. 基本概念 Singleton 是一种创建性模型,它用来确保只产生一个实例,并提供一个访问它的全局访问点.对一些类来说,保证只有一个实例是很重要的,比如有的时候,数据库连接或 Socket 连接要受到一定的限制,必须保持同一时间只能有一个连接的存在.再举个例子,集合中的 set 中不能包含重复的元素,添加到set里的对象必须是唯