设计模式笔记—依赖倒置原则

依赖倒置原则

        概念:英文全称是Dependence Inversion Principle(DIP),依赖倒置原则指代了一种特定的解耦形式,使得高层次(指调用端)的模块不依赖于低层次(具体实现类)的模块的实现细节的目的,依赖模块被颠倒了。该原则有以下几个关键点:(1)高层模块不应该依赖低层模块,两者都应该依赖其抽象;(2)抽象不应该依赖细节;(3)细节不应该依赖抽象。java语言中的表现就是:模块间的依赖通过抽象发生,实现类之间不发生直接的依赖关系,其依赖关系是通过接口或抽象类产生的。简单概括就是面向接口编程,或者说是面向抽象编程。举例如下:
         先看一个反例:
public class Driver {
	public void drive(Benz benz){
		benz.run();
	}
}
public class Benz {
		public void run(){
			System.out.println("奔驰汽车开始启动...");
		}
}
public class Client {
public static void main(String[] args) {
	 Driver lisi = new Driver();
	 Benz benz = new Benz();
	 lisi.drive(benz);
}
}
分析:程序能够正常运行,如果这时候lisi又要开宝马车,就会出现麻烦,不能开。先把宝马产生出来,如下:
public class BMW {
		public void run(){
			System.out.println("宝马汽车启动...");
		}
}
原因:司机类与奔驰车类之间是紧耦合的关系,导致系统的可维护性降低,可读性降低,增加一个车类就需要修改司机类,这没有体现稳定性,而是易变性。被依赖者的变更需要让依赖者来承担修改的成本,这样的依赖关系很糟!此时,就需要引入依赖倒置原则。具体如下:
public interface IDriver {
	public void drive(ICar car);
}
public interface ICar {
	public void run();
}
public class Driver implements IDriver{
	public void drive(ICar car) {
		car.run();
	}
}
public class Benz implements ICar{
		public void run(){
			System.out.println("奔驰汽车开始启动...");
		}
}
public class BMW implements ICar{
		public void run(){
			System.out.println("宝马汽车启动...");
		}
}
public class Client {
public static void main(String[] args) {
	IDriver lisi = new Driver();
	ICar benz = new Benz();
	lisi.drive(benz);
}
}
分析:在业务场景中,贯彻“抽象不应该依赖细节”,也就是我们认为抽象(ICar接口)不依赖BMW和Benz两个实现类(细节),因此高层次的模块中应用都是抽象,如上面Client的实现过程。
        也许你会问,在这个高层模块中也调用到了底层模块,比如new Driver()和new Benz()等,怎么解释?确实如此,lisi的表面类型是IDriver,是抽象的,非实体化的,在其后的所有操作中,lisi都是以IDriver类型进行操作,它屏蔽了细节对抽象的影响。如果lisi要开宝马,只需要修改业务场景类就可以,把“变更”引起的风险扩散降到最小。
       注意:在java中,只要定义变量就必然要有类型,一个变量可以有两种类型:表面类型和实际类型,表面类型是在定义的时候赋予的类型,实际类型是对象的类型,如lisi的表面类型是IDriver,实际类型是Driver.
      依赖的三种写法
      1 构造函数传递依赖对象
public interface IDriver {
	public void drive( );
}
public class Driver implements IDriver{
	private ICar car;
	public Driver(ICar car) {
		this.car=car;
	}
	public void drive( ) {
		this.car.run();
	}
}
      2 Setter方法传递依赖对象
public interface IDriver {
	public void setCar(ICar car);
	public void drive();
}
public class Driver implements IDriver{
	private ICar car;
	public void setCar(ICar car) {
		this.car=car;
	}
	public void drive() {
		this.car.run();
	}
}
      3 接口声明依赖对象 

       总结:依赖倒置原则的本质就是通过抽象(接口或抽象类)使各个类或模块的实现彼此独立,不互相影响,实现模块间的松耦合。







          
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值