设计模式之设计原则(下)
2014-09-08 11:04
183 查看
好久没有写博客啦,因最近在忙于弄自己的一个网站,一直没有时间写了,在这里跟广大园友说声抱歉,今天也正好是中秋节,在这里祝大家节日快乐!废话少说,接续上节的继续写下去。
依赖倒置原则(Dependence Inversion Principle),简称DIP:他的核心思想就是在进行业务设计时,高层模块不应该依赖于底层模块,两者应该依赖与抽象,抽象而不依赖于具体实现,具体实现应该依赖与抽象,这样会使代码变得更稳定,从而大大提高了程序应对业务变化的能力。
我们来看一下一个例子来更深刻的理解一下上面的核心思想:
public class Car { public string CarName; public Car(string carname) { this.CarName = carname; } public void 驾驶() { Console.WriteLine(CarName + ":驾驶"); } } public class Person { public void drive() { Car bmw=new Car("BMW"); bmw.驾驶(); } }
从上面的例子看一下能发现Person类依赖与Car类,这样耦合度高,这样的话比如说Car类发生变化时很容易出现问题,比如说哪天这个Person类不想开汽车了想开火车或者飞机时怎么办,那我们可以改造一下上面的类,Person类不依赖于Car这个具体实现,我们要依赖抽象,依赖与交通工具,我们看看代码:
//交通工具才抽象 public interface IVehicle { void 驾驶(); } //汽车 public class Car : IVehicle { public string CarName; public Car(string carname) { this.CarName = carname; } public void 驾驶() { Console.WriteLine(CarName + ":驾驶"); } } //飞机 public class Plane : IVehicle { public string PlaneName; public Plane(string carname) { this.PlaneName = carname; } public void 驾驶() { Console.WriteLine(PlaneName + ":驾驶"); } } //火车 public class Train : IVehicle { public string TrainName; public Train(string carname) { this.TrainName = carname; } public void 驾驶() { Console.WriteLine(TrainName + ":驾驶"); } } public class Person { private IVehicle machine = null; public Person(IVehicle _vehicle) { machine = _vehicle; } public void drive() { machine.驾驶(); } }
类图如下:
客户端调用代码:
Person person1=new Person(new Car("宝马")); person1.drive(); Person person2=new Person(new Plane("飞机")); person2.drive(); Person person3=new Person(new Train("火车")); person3.drive(); Console.ReadLine();
输出结果如下:
从以上代码可以看出Person类的驾驶方法来说不需要依赖具体的交通工具,只依赖抽象,具体的哪一个交通工具是从外部传入的。这样其实就是抽象编码。也是依赖倒置的有点。
组合优于继承:他的核心思想就是组合比继承更大的灵活性和稳定结构。
为什么怎么说呢,我们来看看他们各自的优缺点:
继承优点:
1)新的实现很容易,因为大部分是继承而来的。
2)很容易修改和扩展已有的实现
继承的缺点:
1)打破了封装,因为基类想子类暴露额具体的实现细节。
2)白盒重用,因为基类的内部细节通常对子类是可见的。
3)当父类发生改变时子类也做出相应的改变。
4)不能在运行时修改由父类继承来的实现。
组合优点:
1)被包含对象通过包含他们的类来访问
2)黑盒重用,因为被包含对象的内部细节是不可见的
3)很好的封装
4)每一个类都专注于一个任务
5)通过获得和被包含对象的类型相同的对象引用,可以在运行时动态定义组合的方式
组合缺点:
1)系统可能会包含更过的对象
2)为了使组合时可以使用不同的对象,必须小心的定义接口。
相关文章推荐
- 设计模式原则
- C#面向对象设计模式纵横谈(1):面向对象设计模式与原则
- 面向对象设计模式与原则
- C#面向对象设计模式纵横谈(1):面向对象设计模式与原则
- 设计模式学习笔记(一)——面向对象设计模式与原则
- 设计模式的两个原则——《C# Design Patterns》笔记(一)
- 面向对象设计模式与原则
- CSharp面向对象设计模式纵横谈--面向对象设计模式与原则 听课笔记
- Java并发编程设计原则与模式
- 设计模式-OOD的设计原则(2)-"里氏代换原则"
- 软件的架构与设计模式:层次原则
- 设计模式-OOD的设计原则(5)-"合成聚合复用原则"
- 设计模式的原则
- 设计模式-OOD的设计原则(3)-"依赖倒转原则"
- OOP编程原则与设计模式(1)
- 设计模式之(1)设计原则
- java设计模式中的几个重要原则
- 设计模式原则
- 设计模式培训1-模式与原则
- 设计模式的原则