?设计模式概念与作用:
设计模式是一套被反复使用的、多数人知晓、经过分类编目的优秀代码设计经验的总结。特定环境下特定问题的处理方法。 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数据库完成
? ? ? ? 以上依赖倒置原则对代码进行重构。
总结:
? ? ? ?
|