• 依赖倒置(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 + "汽车停止");
            }
        }
    }
  • 相关阅读:
    Android 横屏启动activity,点击屏幕的单击、双击
    实现Android简单动画旋转案例
    当时遇到的主要难点在于TextView的内容不会刷新改变值,今天终于通过Timer和Handler实现了,分享给大家
    如何在Android当中显示网络图片
    Android的MediaRecorder架构介绍
    理解Android系统的进程间通信原理RPC机制
    Android开发WeatherForecast程序
    Android 如何导入已有的外部数据库
    百度地图API 源码
    Android TelephonyManager类
  • 原文地址:https://www.cnblogs.com/leestar54/p/5494341.html
Copyright © 2020-2023  润新知