文章目录
- 一、依赖倒置原则简介
- 二、面向实现编程代码示例 ( 反面示例 )
- 1、顾客类
- 2、测试类
- 三、依赖倒置原则代码示例 ( 推荐示例 | 使用接口方法注入 IGood 实现类 )
- 1、顾客类
- 2、商品接口
- 3、冰箱商品
- 4、电视商品
- 5、测试类
- 四、依赖倒置原则代码示例 ( 推荐示例 | 使用构造函数注入 IGood 实现类 )
- 1、顾客类
- 2、商品接口
- 3、冰箱商品
- 4、电视商品
- 5、测试类
- 五、依赖倒置原则代码示例 ( 推荐示例 | 使用 Setter 方法注入 IGood 实现类 )
- 1、顾客类
- 2、商品接口
- 3、冰箱商品
- 4、电视商品
- 5、测试类
一、依赖倒置原则简介
依赖倒置原则 : 高层模块 不应该 依赖 低层模块 , 二者都应该 依赖其抽象 ; 抽象 不应该 依赖细节 , 细节应该依赖抽象 ;
针对接口编程 , 不要针对实现编程 ;
通过抽象 , 包括使用 接口 或 抽象类 , 使个各类或模块之间 彼此独立 , 互不影响 , 从而实现模块之间的 松耦合 , 降低模块间的耦合性 ;
使用依赖倒置原则时的注意点 :
- 每个类都 尽量 实现自接口 或 继承抽象类 ;
- 尽量 避免从具体的类派生 ;
- 尽量 不要覆盖基类方法 ;
依赖倒置原则的优点 : 减少类之间的 耦合性 , 提高系统 稳定性 , 提高 代码可读性 , 可维护性 , 可 降低修改程序所造成的风险 ;
二、面向实现编程代码示例 ( 反面示例 )
1、顾客类
代码语言:javascript复制package dependenceinversion;
/**
* 如果要增加一个新功能 , 就需要在该类中添加一个新方法
* 这就是面向实现编程 , 该实现类需要经常进行修改
* 扩展性很差
*
* 应用层的函数 , 是依赖于底层实现的 , 由于没有实现接口
* 造成了应用层的测试类 , 直接依赖于本类
* 应用层的模块属于高层模块
* 本类属于低层模块
* 根据依赖倒置原则 , 高层次的模块是不应该依赖于低层次的模块的
*/
public class Customer {
public void buyFridge() {
System.out.println("购买冰箱");
}
public void buyTelevision() {
System.out.println("购买电视");
}
}
2、测试类
代码语言:javascript复制package dependenceinversion;
public class Main {
public static void main(String[] args) {
Customer customer = new Customer();
customer.buyFridge();
customer.buyTelevision();
}
}
执行结果 :
代码语言:javascript复制购买冰箱
购买电视
三、依赖倒置原则代码示例 ( 推荐示例 | 使用接口方法注入 IGood 实现类 )
1、顾客类
使用接口方法注入 IGood 实现类 ;
代码语言:javascript复制package dependenceinversion;
public class Customer {
/**
* 接口方法注入 IGood 实现类
* 也可以使用构造函数 , 注入 IGood 实现类
*
* 此处就是面向接口编程
* 如果添加了新的类 , 不需要修改本类
* 只需要添加新的接口实现类即可
* 面向接口编程 , 而不是面向本实现类
* 对于高层模块来说 , 具体传入的参数是什么参数 ,
* 交给高层模块选择
*
* 本类 与 具体的 IGood 接口 实现 是解耦的
* 本类 与 应用层 客户端测试类 之间是解耦的
*
* 如果在添加一个新商品 , 直接定义一个新的接口实现类即可
*
* @param iGood
*/
public void buy(IGood iGood) {
iGood.buy();
}
}
2、商品接口
代码语言:javascript复制package dependenceinversion;
/**
* 商品接口
*/
public interface IGood {
/**
* 购买商品
*/
void buy();
}
3、冰箱商品
代码语言:javascript复制package dependenceinversion;
/**
* 冰箱商品
*/
public class FridgeGood implements IGood {
@Override
public void buy() {
System.out.println("购买冰箱");
}
}
4、电视商品
代码语言:javascript复制package dependenceinversion;
/**
* 电视商品
*/
public class TelevisionGood implements IGood {
@Override
public void buy() {
System.out.println("购买电视");
}
}
5、测试类
代码语言:javascript复制package dependenceinversion;
public class Main {
public static void main(String[] args) {
Customer customer = new Customer();
customer.buy(new FridgeGood());
customer.buy(new TelevisionGood());
}
}
执行结果 :
代码语言:javascript复制购买冰箱
购买电视
四、依赖倒置原则代码示例 ( 推荐示例 | 使用构造函数注入 IGood 实现类 )
1、顾客类
使用构造函数注入 IGood 实现类 ;
代码语言:javascript复制package dependenceinversion;
public class Customer {
private IGood iGood;
/**
* 使用构造函数注入 IGood 实现类
* @param iGood
*/
public Customer(IGood iGood) {
this.iGood = iGood;
}
public void buy() {
this.iGood.buy();
}
}
2、商品接口
代码语言:javascript复制package dependenceinversion;
/**
* 商品接口
*/
public interface IGood {
/**
* 购买商品
*/
void buy();
}
3、冰箱商品
代码语言:javascript复制package dependenceinversion;
/**
* 冰箱商品
*/
public class FridgeGood implements IGood {
@Override
public void buy() {
System.out.println("购买冰箱");
}
}
4、电视商品
代码语言:javascript复制package dependenceinversion;
/**
* 电视商品
*/
public class TelevisionGood implements IGood {
@Override
public void buy() {
System.out.println("购买电视");
}
}
5、测试类
代码语言:javascript复制package dependenceinversion;
public class Main {
public static void main(String[] args) {
Customer customer = new Customer(new FridgeGood());
customer.buy();
Customer customer2 = new Customer(new TelevisionGood());
customer2.buy();
}
}
执行结果 :
代码语言:javascript复制购买冰箱
购买电视
五、依赖倒置原则代码示例 ( 推荐示例 | 使用 Setter 方法注入 IGood 实现类 )
1、顾客类
使用 Setter 方法注入 IGood 实现类 ;
代码语言:javascript复制package dependenceinversion;
public class Customer {
private IGood iGood;
public void setiGood(IGood iGood) {
this.iGood = iGood;
}
public void buy() {
this.iGood.buy();
}
}
2、商品接口
代码语言:javascript复制package dependenceinversion;
/**
* 商品接口
*/
public interface IGood {
/**
* 购买商品
*/
void buy();
}
3、冰箱商品
代码语言:javascript复制package dependenceinversion;
/**
* 冰箱商品
*/
public class FridgeGood implements IGood {
@Override
public void buy() {
System.out.println("购买冰箱");
}
}
4、电视商品
代码语言:javascript复制package dependenceinversion;
/**
* 电视商品
*/
public class TelevisionGood implements IGood {
@Override
public void buy() {
System.out.println("购买电视");
}
}
5、测试类
代码语言:javascript复制package dependenceinversion;
public class Main {
public static void main(String[] args) {
Customer customer = new Customer();
customer.setiGood(new FridgeGood());
customer.buy();
customer.setiGood(new TelevisionGood());
customer.buy();
}
}
执行结果 :
代码语言:javascript复制购买冰箱
购买电视