zoukankan      html  css  js  c++  java
  • 依赖倒置(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 + "汽车停止");
            }
        }
    }
  • 相关阅读:
    Heidisql导入导出SQL脚本
    递归遍历删除children为[]的children
    将v-model的值绑定到vuex中时遇到的问题及解决办法(computed替代watch)
    为什么不建议v-for和v-if一起使用
    vue全选和取消全选的实现方式(主要是理解computed中的set和get)
    全部设置为仅查看/可编辑【第三种方法:computed】
    全部设置为仅查看/可编辑【第二种方法:watch+methods】
    全部设置为仅查看/可编辑【第一种方法:watch】
    v-model的三个修饰符
    在表单元素上使用v-model的注意事项
  • 原文地址:https://www.cnblogs.com/leestar54/p/5494341.html
Copyright © 2011-2022 走看看