设计模式是一套被反复使用的、多数人知晓、经过分类编目的优秀代码设计经验的总结。特定环境下特定问题的处理方法。
1)重用设计和代码 重用设计比重用代码更有意义,自动带来代码重用
2)提高扩展性 大量使用面向接口编程,预留扩展插槽,新的功能或特性很容易加入到系统中来
3)提高灵活性 通过组合提高灵活性,可允许代码修改平稳发生,对一处修改不会波及到其他模块
4) 提高开发效率 正确使用设计模式,可以节省大量的时间
1.单一职责原则
2.里氏替换原则
3.依赖倒置原则
4.接口隔离原则
5.迪米特法则
6.开闭原则
依赖倒置原则(Dependence Inversion Principle(DIP))高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。核心思想是:要面向接口编程,不要面向实现编程。
依赖倒置原则的作用:
依赖倒置原则遵循以下几点
案例:先不考虑依赖倒置原则,我们设计一段程序,需求是:有一个商城项目,要连接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数据库完成
以上依赖倒置原则对代码进行重构。