熟练掌握和应用面向对象设计七大原则,是初中级工程师向高级/资深工程师进阶的一个必备技能。他可以大大的提升程序的可复用性和可维护性是重构代码的一大利器。
本人菜鸟一枚本面文章的出发点是1.加深个人印象。2.作为笔记记录。3.分享。文章中有描述的不到位或者不正确的地方各位大佬多多指出多多包涵。
使用设计模式的根本原因是适应变化,提升代码的复用率,扩展性,维护性和可读性。在设计时需要遵守以下七大原则:
⑴ 单一职责原则
⑵ 开放封闭原则
⑶ 依赖倒置原则
⑷ 里氏替换原则
⑸ 接口隔离原则
⑹ 组合复用原则
⑺ 迪米特原则
依赖倒置原则
抽象不应该依赖于细节,细节应该依赖于抽象。也就是提出的面向接口开发,而不是面向实现开发。说简单点就是除了变量、返回值、参数,其他类型都是抽象的,而不是具体的。
鉴于以上的特点:
⑴ 每个类尽量是继承自接口或者抽象类,或者二者的结合。
⑵ 每个类不应该从具体类派生。
⑶ 由于有使用继承,尽量按照里氏替换原则。
代码如下:
class Program
{
static void Main(string[] agrs)
{
FeedDog feedDog = new FeedDog();
feedDog.Feed(new RedDog());
//如果想喂黄色的狗,不得不在FeedDog类中写入一个重载方法,违背了开放封闭原则
}
}
class Dog
{
public string name;
public int age;
public void Eat()
{
Console.WriteLine("{0}吃狗粮", name);
}
}
class RedDog : Dog
{
}
class YellowDog : Dog
{
}
class FeedDog
{
public void Feed(RedDog redDog)
{
//喂红色狗
}
public void Feed(YellowDog yellowDog)
{
//喂黄色狗
}
}
如果想喂黄色的狗,不得不在FeedDog类中写入一个重载方法,违背了开放封闭原则。正确代码应该是:(只需要对Feed函数进行修改即可)
class Program
{
static void Main(string[] agrs)
{
FeedDog feedDog = new FeedDog();
feedDog.Feed(new RedDog());
feedDog.Feed(new YellowDog());
}
}
class Dog
{
public string name;
public int age;
public void Eat()
{
Console.WriteLine("{0}吃狗粮", name);
}
}
class RedDog : Dog
{
}
class YellowDog : Dog
{
}
class FeedDog
{
public void Feed(Dog dog)
{
//喂狗
}
}
以上不仅仅体现在形参上,还体现在方法 属性的返回值,字段类型等。