摘要:
我们来看一个有关一个类向另一个类发送消息的示例:Button对象感知外部环境的变化,当接收到Poll指令后,它会控制Lamp对象的显示或熄灭.如何设计一个用Button对象控制Lamp对象的系统呢?通常我们会按照下图的意思去实现这个功能.在这里,Button类直接依赖于Lamp类,当它接收到Poll消息后,判断按钮是否被按下,接着简单的发送TurnOn或者TurnOff消息给Lamp.按照这样的实现,当Lamp类改变时,Button类会收到影响.此外想让Button控制一个Motor对象是不可能的,它只能控制Lamp对象.这个方案违反了DIP.应用程序的高层策略没有和低层分离.抽象没有和具体. 阅读全文
随笔档案-2012年03月
OOP的几个原则-----DIP:依赖倒置原则(上)
2012-03-14 06:46 by 宅的一米, 273 阅读, 收藏,
摘要:
DIP原则的定义是:高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象.很多时候,一些传统的开发方式比较倾向于创建一些高层模块依赖于低层模块,策略依赖于细节.实际上这些方法的目的之一就是要定义子程序的程序层次结构,以描述该层次的高层模块如何调用低层模块.考虑下这些高层模块意味着什么?正是高层模块包含了应用程序中重要的策略选择和业务模型.这些高层模块使得所在的应用程序区别于其他.然而,如果这些高层模块依赖于低层模块,那么对低层模块的改动就会直接影响高层模块,从而迫使它们依次做出改动.此外,我们都希望能够重用高层的策略设置模块.我们已经经常通过子程序库的. 阅读全文
OOP的几个原则-----LSP:Liskov替换原则(下)
2012-03-09 02:47 by 宅的一米, 281 阅读, 收藏,
摘要:
LSP让我们得出一个结论:一个模型如果孤立的看并不具有真正意义上的有效性.最后那个版本的Square类和Rectangle类是自相容并且有效的,但是从Rectangle类作出合理假设的角度看,这个模型是有问题的.所以模型的有效性只能通过它的客户程序来表现.那么是什么原因导致Square和Rectangle这个显然合理的模型出现问题?难道Square和Rectangle不存在IS-A的关系吗?对于那些不是g函数的编写者来说,正方形可以是长方形,但是从g函数的角度来说,Square绝不是Rectangle对象,因为Square对象的行为方式和函数g所期望的Rectangle对象的行为方式不相容,. 阅读全文
OOP的几个原则-----LSP:Liskov替换原则(上)
2012-03-08 00:54 by 宅的一米, 376 阅读, 收藏,
摘要:
LSP的定义是:子类型必须能够替换掉它们的基类型.OCP主要的机制是抽象和多态.而LSP探讨的问题是如何构建最佳的集成层次,它们的特征是什么?如何避免使我们创建的类层次结构掉进不符合OCP的陷阱中去.Barbara Liskov在1988年首次提出这个原则:若对类型S的每一个对象O1,都存在一个类型T的对象O2,使得在所有针对T编写的程序P中,用O1替换O2后,程序P的行为功能不变,则S是T的子类型.按照这个原则我们可以大致推导出这样一段代码:View Code classProgram{staticvoidMain(string[]args){So1=newS();P.Show(o1);C. 阅读全文
OOP的几个原则-----OCP:开闭原则(下)
2012-03-05 23:44 by 宅的一米, 374 阅读, 收藏,
摘要:
上一篇着重介绍了开闭原则的概念,通过类图我们可以看出,如果不对Client和Server类进行解耦,当Client类需要使用另外一个Server类时,必须对相关代码进行修改.导致不必要的僵化性和脆弱性.下面将通过一个渐进的示例来展示如何运用开闭原则:1.客户需要有一个在标准GUI上绘制圆应用程序.Circle类View Code classCircle{privateGuid_id;publicCircle(){_id=Guid.NewGuid();}publicvoidDraw(){Console.WriteLine("ID:{0}圆形绘制",_id.ToString(& 阅读全文
OOP的几个原则-----OCP:开闭原则(上)
2012-03-05 01:32 by 宅的一米, 533 阅读, 收藏,
摘要:
开闭原则的定义是:软件实体(类/模块/函数)应该是可以扩展的,但是不可以修改如果程序中的一处代码修改产生连锁反应,导致一系列相关模块的修改,那么设计就具有僵化性.开闭原则建议我们对系统进行重构,这样以后对系统在进行同样的改动,就不会导致更多的修改.如何正确使用开闭原则,那么以后再进行同样的改动时,只需要添加新的代码,而不必改动正常运行的代码.遵循开闭原则的模块主要有两个特征:1.对于扩展是开放的:意味着模块的行为是可扩展的,当应用程序发生变化时,我们可以对模块进行扩展,使其具有满足那些改变的新行为.换句话说我们可以改变模块的功能.2.对于修改是封闭的:对模块进行扩展是,不必改动模块的源代码或. 阅读全文