首页 > 其他分享 >必知必会的设计原则——依赖倒置原则

必知必会的设计原则——依赖倒置原则

时间:2023-02-08 09:12:16浏览次数:48  
标签:原则 必知 car void ICar class new 倒置 public

概述

开放封闭原则是面向对象的设计的中级目标,而依赖倒置原则是实现开放封闭原则的基础。
如果开放封闭原则是设计大楼的蓝田,那么依赖倒置原则就是大楼的钢铁架构。

高层模块(调用者)不应该依赖于低层模块(被调用者),两个都应该依赖于抽象。依赖倒置原则的本质是通过接口或抽象使各个模块的实现独立,彼此互补影响,从而实现模块间的松耦合。

未使用依赖倒置原则的代码

    /// <summary>
    /// 重复代码很多, Singer作为高层模块,严重依赖底层模块 不符合依赖倒置原则,开放封闭原则 -单一职责原则
    /// </summary>
    public class Singer
    {
        public void SingSong(ChineseSong chineseSong)
        {
            Console.WriteLine($"歌手正在唱{chineseSong.GetSongWords()}");
        }
        public void SingSongEnglish(EnglishSong englishSong)
        {
            Console.WriteLine($"歌手正在唱{englishSong.GetSongWords()}");
        }
    }

    public class ChineseSong
    { 
    public string GetSongWords()
        {
            return "中国歌曲";
        }
    }
    public class EnglishSong
    {
        public string GetSongWords()
        {
            return "外国歌曲";
        }
    }
//C#控制台调用
Singer singer = new Singer();
singer.SingSong(new ChineseSong());
singer.SingSongEnglish(new EnglishSong());

结论:重复代码很多, Singer作为高层模块,严重依赖底层模块 不符合依赖倒置原则,开放封闭原则 -单一职责原则。

面向接口编程的代码

 public interface ISongWords
    {
        public string GetSongWords();
    }

    public class ChineseSong2: ISongWords
    {
        public string GetSongWords()
        {
            return "中国歌曲";
        }
    }
    public class EnglishSong2 : ISongWords
    {
        public string GetSongWords()
        {
            return "外国歌曲";
        }
    }

    public class Singer2
    {
        public void SingSong(ISongWords songWords)
        {
            Console.WriteLine($"歌手正在唱{songWords.GetSongWords()}");
        }
    }
//C#控制台调用
Singer2 singer2 = new Singer2();
ISongWords songWords = new ChineseSong2();
singer2.SingSong(songWords);

依赖倒置原则的代码

抽象不应该依赖细节  细节应该依赖抽象。

    public interface ICar
    {
        void Run();
    }
    public class Benz : ICar
    {
        public void Run()
        {
            Console.WriteLine("奔驰汽车在本跑");
        }
    }
    public class AoDi : ICar
    {
        public void Run()
        {
            Console.WriteLine("奥迪汽车在本跑");
        }
    }


    public interface IDriver
    {
        //在接口或类中 将要注入的服务对象,以参数的形式直接注入,我们称之为接口注入;
        void Drive(ICar car);
        void Drive();
        void SetCar(ICar car);
    }
    public class Student : IDriver
    {
        private ICar _car;
       /// <summary>
       /// 接口注入
       /// </summary>
       /// <param name="car"></param>
        public void Drive(ICar car)
        {
          car.Run();
        }

        public void Drive()
        {
            _car.Run();
        }
        /// <summary>
        /// 属性注入
        /// </summary>
        /// <param name="car"></param>
        public void SetCar(ICar car)
        {
            _car=car;   
        }
    }
    public class Teacher : IDriver
    {
        private readonly ICar _car;
        /// <summary>
        /// 构造函数注入
        /// </summary>
        /// <param name="car"></param>
        public Teacher(ICar car)
        {
            _car = car;
        }
        public void Drive(ICar car)
        {
            throw new NotImplementedException();
        }
        public void SetCar(ICar car)
        {
            throw new NotImplementedException();
        }
        public void Drive()
        {
            _car.Run();
        }
    }
//C#控制台调用
IDriver driver = new Student();
ICar car = new Benz();
driver.Drive(car);

driver.SetCar(car);
driver.Drive();

IDriver driver1 = new Teacher(car);
driver1.Drive(car); 

总结

以上就是关于依赖倒置原则的内容,有何疑问,欢迎与我沟通交流。

标签:原则,必知,car,void,ICar,class,new,倒置,public
From: https://www.cnblogs.com/mhg215/p/17097888.html

相关文章

  • 大数据必知必会:Zookeeper(3)集群环境安装
    摘要】Zookeeper3.8.0集群环境安装安装前准备集群环境下,至少需要3台服务器。IP地址主机名称10.0.0.5node110.0.0.6node210.0.0.7node3需要保......
  • 封装的原则
    一个类常常就是一个小的模块,应该只让这个模块公开必须让外界知道的内容,而隐藏其他一切内容。进行程序设计时,应尽量避免一个模块直接操作和访问另一个模块的数据,模块设计追......
  • MySql查询性能优化必知必会
    作为一个写业务代码的"JAVACURDBOY",具备写出高效率SQL让应用高性能访问数据库的能力非常重要。获得这个能力的过程我收获了点知识和经验,今天在这里分享出来,希望大家多多......
  • 必知必会的设计原则——开放封闭原则
    概述开放封闭原则是面向对象所有原则的核心。对功能扩展开放,面向修改代码封闭。需求改变时,在小改变软件实体源代码(类、接口、方法等)的前提下通过扩展功能使其满足新的需......
  • 【android】Android性能优化之APP性能优化原则总结
    使用过Android系统手机的同学都知道,Android手机越用越卡,这个卡主要体现在手机系统越用越卡,打开APP的速度越来越慢。Android手机越用越卡的原因主要有:1、Android系统源码是......
  • 数据库必知必会:TiDB(1)数据库架构概述
    (数据库必知必会:TiDB(1)数据库架构概述)TiDB体系架构TiDB兼容MySQL5.7协议,支持水平扩容或者缩容的金融级高可用的云原生分布式数据库。TiDB的体系架构为:TiDBServer,接收......
  • Java设计原则
    在软件开发中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据6条原则来开发程序,从而提高软件开发效率、节约软件开发成本和维护成本。......
  • 面向对象五大原则
    一、单一功能原则(SingleResponsibilityPrinciple) 一个类都应该有一个单一的功能,不为其实现过多的功能点 二、开闭原则(OpenClosedPrinciple) 软件中的对......
  • 必知必会的设计原则——单一职责原则
    概述单一职责原则是最简单的面向对象设计原则!定义为不要存在多于一个导致类变更的原因。通俗的说,即一个类只负责一项职责。说文字比较干巴巴,我们通过上代码来展示案例;未......
  • C/C++内存对齐原则
    C/C++内存对齐what&&why当用户自定义类型时(struct或class),编译器会自动计算该类型占用的字节数。C/C++为什么要内存对齐?我道行太浅,摘抄了网上的一个解释。为了方......