依赖倒置(Dependence Inversion Principle)DIP

关于抽象类和接口的区别,可以参考之前的文章~http://www.cnblogs.com/leestar54/p/4593173.html

using System;
using System.Collections.Generic;
using System.Text;

namespace DependenceInversionPrinciple
{
    //依赖倒置(Dependence Inversion Principle)DIP
    //High level modules should not depend upon low level modeules.Both should depend upon abstractions.Abstractions should not depend upon details. Details shoudl depend upon abstractions.
    //(1)模块间的依赖通过抽象发生,实现类直接不发生直接的依赖关系,其依赖关系是通过接口或者抽象类产生的。
    //(2)接口或抽象类不依赖于实现类
    //(3)实现类依赖接口或抽象类。
    //OOD(Object-Oriented Design)面向接口编程精髓之一。
    class Program
    {
        static void Main(string[] args)
        {
            //模拟这么一个场景,司机开车遇到查车情况。
            Driver driver = new Driver("小李");
            Benz benz = new Benz();
            BMW bmw = new BMW();
            //多亏了依赖倒置,这样不用在Drive函数里每次针对不同的车型写一个方法,因为它们都是车子,开起来其实是一样的,管他什么牌子。
            driver.Drive(benz);
            //换一辆车开
            driver.Drive(bmw);

            //这时遇到了交警,查车,千万别酒驾哟!
            CheckLicense(driver);
        }

        //这里使用IC1,而没有使用Driver类来做参数类,是因为交警只关注你的驾照情况,如果使用Driver类,会暴露过多的方法和属性,照成不必要的耦合风险。
        static void CheckLicense(IC1 c1)
        {
            c1.ShowInfo();
        }
    }

    //C1驾照接口,有了驾照的人,肯定都可以开小汽车了,不管你的职业是不是司机,这是一个共同的“行为”。
    public interface IC1
    {
        void ShowInfo();
        void Drive(Car car);

    }

    public class Driver : IC1
    {
        public Driver(string name)
        {
            this.Name = name;
        }

        private string name;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public void Drive(Car car)
        {
            car.Start();
            car.Stop();
        }

        public void ShowInfo()
        {
            Console.WriteLine(this.Name + "的驾照是C1驾照");
        }
    }

    //抽象车子,肯定有启动和停止,至于不同车子实现方式不同,抽象出来,给子类实现。
    //为什么不使用接口?这需要关注业务情况进行抽象设计,如果该业务方法涉及到其他的交通工具,如自行车,这个时候用接口,能增强扩展性,扩展一个自行车类,继承接口即可使用。
    //但是这里没有涉及到,仅专注于小汽车,所以抽象类即可。
    public abstract class Car
    {
        private string brand;

        public string Brand
        {
            get { return brand; }
            set { brand = value; }
        }

        public abstract void Start();

        public abstract void Stop();

    }

    public class BMW : Car
    {
        public BMW()
        {
            this.Brand = "宝马";
        }

        public override void Start()
        {
            Console.WriteLine(this.Brand + "汽车启动");
        }

        public override void Stop()
        {
            Console.WriteLine(this.Brand + "汽车停止");
        }
    }

    public class Benz : Car
    {
        public Benz()
        {
            this.Brand = "奔驰";
        }

        public override void Start()
        {
            Console.WriteLine(this.Brand + "汽车启动");
        }

        public override void Stop()
        {
            Console.WriteLine(this.Brand + "汽车停止");
        }
    }
}

 

posted @ 2016-05-15 01:13  leestar54  阅读(303)  评论(0编辑  收藏  举报