设计模式六大原则--依赖倒转原则
2014-02-17 13:54
387 查看
背景
前段时间有同学感觉自己电脑内存不够用了想买个内存条,只看她在网上捣鼓了一会就搞定了。也没见她看内存条的具体型号是否可以在其电脑上使用等等知识。一时不得其解,网上查了查才知道电脑的硬件是面向接口设计的,最近正好在学习设计模式,我想这是不是和设计模式中的依赖倒转原则有点关系。下面就让小生带领大家详细了解一下“依赖倒转原则(Dependence Inversion Principle)”吧。
定义
1、高层模块不应该依赖底层模块,两者都应该依赖抽象。
2、抽象不应该依赖于细节,细节应该依赖于抽象。
(原意:High level modules should not dependupon low level modules. Both should depend upon abstractions. Abstractionsshould not depend upon details. Details should depend upon abstractions)
详细说明
依赖倒转其实可以说是面向对象设计的标志,用那种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程。
示例
假设我们有一个上层类Manager和底层类Worker。我们需要在程序中添加一个新模块,为此我们创建一个新的类SuperWorker。
我们假设Manager是一个包含非常复杂的逻辑的类,现在引入新的SuperWorker,我们需要修改它。这样Manager类中一些现有功能可能受到影响,我们需要重新做单元测试,和其他一系列的问题。
所有的问题我们需要用大量的时间去解决,但是如果程序的设计符合依赖倒转原则将会非常简单。我们可以设计一个接口IWorker,让Worker类去实现它。当需要添加SuperWorker类时,我们只需要让它实现IWorker接口即可,这样就避免了Manger类的改动。
下面是不符合依赖倒转原则的代码。
下面是支持依赖倒转原则的代码。增加一个新的抽象层IWork接口。使得增添SuperWorker累世不需要修改Manager类使其对Manager类现有功能的影响最小化。
(实例来源:http://zjliu.iteye.com/blog/423221#,与此同时设计模式中大量的用到了这个原则,想深入研究的朋友可以了解一下)
优点
采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,减少并行开发引起的风险,提高代码的可读性和可维护性。
前段时间有同学感觉自己电脑内存不够用了想买个内存条,只看她在网上捣鼓了一会就搞定了。也没见她看内存条的具体型号是否可以在其电脑上使用等等知识。一时不得其解,网上查了查才知道电脑的硬件是面向接口设计的,最近正好在学习设计模式,我想这是不是和设计模式中的依赖倒转原则有点关系。下面就让小生带领大家详细了解一下“依赖倒转原则(Dependence Inversion Principle)”吧。
定义
1、高层模块不应该依赖底层模块,两者都应该依赖抽象。
2、抽象不应该依赖于细节,细节应该依赖于抽象。
(原意:High level modules should not dependupon low level modules. Both should depend upon abstractions. Abstractionsshould not depend upon details. Details should depend upon abstractions)
详细说明
依赖倒转其实可以说是面向对象设计的标志,用那种语言来编写程序不重要,如果编写时考虑的都是如何针对抽象编程而不是针对细节编程。
示例
假设我们有一个上层类Manager和底层类Worker。我们需要在程序中添加一个新模块,为此我们创建一个新的类SuperWorker。
我们假设Manager是一个包含非常复杂的逻辑的类,现在引入新的SuperWorker,我们需要修改它。这样Manager类中一些现有功能可能受到影响,我们需要重新做单元测试,和其他一系列的问题。
所有的问题我们需要用大量的时间去解决,但是如果程序的设计符合依赖倒转原则将会非常简单。我们可以设计一个接口IWorker,让Worker类去实现它。当需要添加SuperWorker类时,我们只需要让它实现IWorker接口即可,这样就避免了Manger类的改动。
下面是不符合依赖倒转原则的代码。
//Dependency Inversion Priciple-Bad example class Worker { public void Work() { //......working } } class Manager { Worker worker = new Worker(); public void SetWorker(Worker w) { worker = w; } public void Manage() { worker.Work(); } } class SuperWorker { public void Work() { //......working much more } }
下面是支持依赖倒转原则的代码。增加一个新的抽象层IWork接口。使得增添SuperWorker累世不需要修改Manager类使其对Manager类现有功能的影响最小化。
//Dependency Inversion Priciple-Good example interface IWorker { public void Work(); } class Worker:IWorker { public void Work() { //......working } } class SuperWorker : IWorker { public void Work() { //......working much more } } class Manager { Worker worker = new Worker(); public void SetWorker(Worker w) { worker = w; } public void Manage() { worker.Work(); } }
(实例来源:http://zjliu.iteye.com/blog/423221#,与此同时设计模式中大量的用到了这个原则,想深入研究的朋友可以了解一下)
优点
采用依赖倒置原则可以减少类间的耦合性,提高系统的稳定性,减少并行开发引起的风险,提高代码的可读性和可维护性。
相关文章推荐
- to disable the entity lazy load, The ObjectContext instance has been disposed and can no longer be used for operations that require a connection.
- TPKeyboardAvoidingScrollView 实现自动上滚,避免键盘遮盖住了textfield,textview等控件
- ASIHttpRequest-发送数据
- winrt xaml toolkit charts动态添加图表报Error HRESULT E_FAIL has been returned from a call to a COM componen
- Android到底哪个Acitivity启动
- tomcat linux startup.sh jdk配置
- java jvm 内存分配
- iOS 真机调试
- 2.17
- lua
- php实现网页HTML标签补全方法
- ASIHttpRequest-创建和执行request
- Ext3.2.2 表格随窗口改变动态适应窗体大小
- ThinkPad X61 高分屏安装Win8.1,Ubuntu
- SVN(64位)报 Failed to load JavaHL Library. 的解决方法
- 无论何时,记得做好代码的清理工作
- 罗宾逊:这家百年物流公司,如何老树发新芽
- 拒绝平庸
- ASIHTTPRequest-直接读取磁盘数据流的请求体
- Linux web服务器分区方案