设计模式—依赖倒置原则

 设计模式概念与作用:

设计模式是一套被反复使用的、多数人知晓、经过分类编目的优秀代码设计经验的总结。特定环境下特定问题的处理方法。
1)重用设计和代码 重用设计比重用代码更有意义,自动带来代码重用
2)提高扩展性 大量使用面向接口编程,预留扩展插槽,新的功能或特性很容易加入到系统中来
3)提高灵活性 通过组合提高灵活性,可允许代码修改平稳发生,对一处修改不会波及到其他模块
4) 提高开发效率 正确使用设计模式,可以节省大量的时间





设计模式六大原则:

1.单一职责原则
2.里氏替换原则
3.依赖倒置原则
4.接口隔离原则
5.迪米特法则
6.开闭原则





依赖倒置原则:

依赖倒置原则(Dependence Inversion Principle(DIP))高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。核心思想是:要面向接口编程,不要面向实现编程。

依赖倒置原则的作用:

  1. 可以降低类间的耦合性
  2. 可以提高系统的稳定性
  3. 可以减少并行开发引起的风险
  4. 可以提高代码的可读性和可维护性

依赖倒置原则遵循以下几点

  1. 每个类尽量都要有接口或抽象类,或者抽象类和接口都有。
  2. 变量的表面类型尽量是接口或者抽象类
  3. 任何类都不应该从具体类派生
  4. 使用继承时尽量遵循里氏替换原则





案例说明:

案例:先不考虑依赖倒置原则,我们设计一段程序,需求是:有一个商城项目,要连接MySQL数据库。我们用ShopProject类代表商城项目,用MySQLDB类代表MySQL数据库。

package com.design.principle.demo03;

public class ShopProject {

	//连接MySQLDB数据库
	public void connectDB(MySQLDB  mySQLDB){
		mySQLDB.info();
	}
}
package com.design.principle.demo03;

public class MySQLDB{
	
	public void info(){
		System.out.println("连接MySQLDB数据库完成");
	}
}
package com.design.principle.demo03;

public class Test {

	public static void main(String[] args) {
		ShopProject shopProject = new ShopProject();
		MySQLDB mySQLDB = new MySQLDB();
		shopProject.connectDB(mySQLDB);
	}
}

执行结果

连接MySQLDB数据库完成

结果:程序执行结果,看起来没什么问题。但是,假如我们要更换Oracle数据库呢,我们需要新增

OracleDB数据库类。但是ShopProject不能连接OracleDB,因为ShopProject没有实现连接OracleDB类的方法。我们还得添加连接OracleDB的方法。高层模块也得修改,才可以执行

package com.design.principle.demo03;

public class OracleDB{

	public void info(){
		System.out.println("连接OracleDB数据库完成");
	}
}

package com.design.principle.demo03;

public class ShopProject{

	// 连接MySQLDB数据库
	public void connectDB(MySQLDB mySQLDB) {
		mySQLDB.info();
	}
	
	// 连接OracleDB数据库
	public void connectDB(OracleDB oracleDB) {
		oracleDB.info();
	}

}

package com.design.principle.demo03;

public class Test {

	public static void main(String[] args) {
		ShopProject shopProject = new ShopProject();
		OracleDB oracleDB = new OracleDB();
		shopProject.connectDB(oracleDB);
	}
}

执行结果

连接OracleDB数据库完成

额,我们改了ShopProject类,新增了OracleDB,高级模块(测试类)也改了。最终才完成了连接OracleDB的需求。

突然需求又增加了,我们一个新的工程类要连接OracleDB,我们还要增加ManageProject。太烦人了,需求不断增加,代码无止境的修改。

接下来我们用依赖倒置原则来实现以上代码。

首先我们需要定义接口IProject接口,ShopProject、还有未写的ManageProject,以及将来新增的工程类都继承IProject。 然后定义IDB数据库接口,OracleDB、MySQLDB、或者之后新增的其他数据库都继承IDB。

package com.design.principle.demo04;

public interface IProject {
	
	public void connectDB(IDB idb);
}
package com.design.principle.demo04;

public interface IDB {
	public void info();
}
package com.design.principle.demo04;

public class ShopProject implements IProject{
	
	// 连接数据库
	@Override
	public void connectDB(IDB idb) {
		idb.info();
	}
}
package com.design.principle.demo04;

public class MySQLDB implements IDB {

	// 连接MySQLDB数据库
	@Override
	public void info() {
		System.out.println("连接MySQLDB数据库完成");
	}

}
package com.design.principle.demo04;

public class OracleDB implements IDB{

	//连接OracleDB
	@Override
	public void info(){
		System.out.println("连接OracleDB数据库完成");
	}
}
package com.design.principle.demo04;

public class Test {

	public static void main(String[] args) {
		IProject shopProject = new ShopProject();
		IDB mySQLDB = new MySQLDB();
		shopProject.connectDB(mySQLDB);
		
		IDB oracleDB = new OracleDB();
		shopProject.connectDB(oracleDB);
	}
}

执行结果

连接MySQLDB数据库完成
连接OracleDB数据库完成

        以上依赖倒置原则对代码进行重构。

总结:

       

你可能感兴趣的:(设计模式,单一职责原则,设计模式,java)