您的位置:首页 > 其它

设计模式之设计原则(下)

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)为了使组合时可以使用不同的对象,必须小心的定义接口。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: