【设计模式】软件设计七大原则 ( 依赖倒置原则 | 代码示例 )
【摘要】
文章目录
一、依赖倒置原则简介二、面向实现编程代码示例 ( 反面示例 )1、顾客类2、测试类
三、依赖倒置原则代码示例 ( 推荐示例 | 使用接口方法注入 IGood 实现类 )1、顾客类2、...
一、依赖倒置原则简介
依赖倒置原则 : 高层模块 不应该 依赖 低层模块 , 二者都应该 依赖其抽象 ;
抽象 不应该 依赖细节 , 细节应该依赖抽象 ;
针对接口编程 , 不要针对实现编程 ;
通过抽象 , 包括使用 接口 或 抽象类 , 使个各类或模块之间 彼此独立 , 互不影响 , 从而实现模块之间的 松耦合 , 降低模块间的耦合性 ;
使用依赖倒置原则时的注意点 :
- 每个类都 尽量 实现自接口 或 继承抽象类 ;
- 尽量 避免从具体的类派生 ;
- 尽量 不要覆盖基类方法 ;
依赖倒置原则的优点 : 减少类之间的 耦合性 , 提高系统 稳定性 , 提高 代码可读性 , 可维护性 , 可 降低修改程序所造成的风险 ;
二、面向实现编程代码示例 ( 反面示例 )
1、顾客类
package dependenceinversion;
/**
* 如果要增加一个新功能 , 就需要在该类中添加一个新方法
* 这就是面向实现编程 , 该实现类需要经常进行修改
* 扩展性很差
*
* 应用层的函数 , 是依赖于底层实现的 , 由于没有实现接口
* 造成了应用层的测试类 , 直接依赖于本类
* 应用层的模块属于高层模块
* 本类属于低层模块
* 根据依赖倒置原则 , 高层次的模块是不应该依赖于低层次的模块的
*/
public class Customer {
public void buyFridge() {
System.out.println("购买冰箱");
}
public void buyTelevision() {
System.out.println("购买电视");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
2、测试类
package dependenceinversion;
public class Main {
public static void main(String[] args) {
Customer customer = new Customer();
customer.buyFridge();
customer.buyTelevision();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
执行结果 :
购买冰箱
购买电视
- 1
- 2
三、依赖倒置原则代码示例 ( 推荐示例 | 使用接口方法注入 IGood 实现类 )
1、顾客类
使用接口方法注入 IGood 实现类 ;
package dependenceinversion;
public class Customer {
/**
* 接口方法注入 IGood 实现类
* 也可以使用构造函数 , 注入 IGood 实现类
*
* 此处就是面向接口编程
* 如果添加了新的类 , 不需要修改本类
* 只需要添加新的接口实现类即可
* 面向接口编程 , 而不是面向本实现类
* 对于高层模块来说 , 具体传入的参数是什么参数 ,
* 交给高层模块选择
*
* 本类 与 具体的 IGood 接口 实现 是解耦的
* 本类 与 应用层 客户端测试类 之间是解耦的
*
* 如果在添加一个新商品 , 直接定义一个新的接口实现类即可
*
* @param iGood
*/
public void buy(IGood iGood) {
iGood.buy();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
2、商品接口
package dependenceinversion;
/**
* 商品接口
*/
public interface IGood {
/**
* 购买商品
*/
void buy();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
3、冰箱商品
package dependenceinversion;
/**
* 冰箱商品
*/
public class FridgeGood implements IGood {
@Override
public void buy() {
System.out.println("购买冰箱");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
4、电视商品
package dependenceinversion;
/**
* 电视商品
*/
public class TelevisionGood implements IGood {
@Override
public void buy() {
System.out.println("购买电视");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
5、测试类
package dependenceinversion;
public class Main {
public static void main(String[] args) {
Customer customer = new Customer();
customer.buy(new FridgeGood());
customer.buy(new TelevisionGood());
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
执行结果 :
购买冰箱
购买电视
- 1
- 2
四、依赖倒置原则代码示例 ( 推荐示例 | 使用构造函数注入 IGood 实现类 )
1、顾客类
使用构造函数注入 IGood 实现类 ;
package dependenceinversion;
public class Customer {
private IGood iGood;
/**
* 使用构造函数注入 IGood 实现类
* @param iGood
*/
public Customer(IGood iGood) {
this.iGood = iGood;
}
public void buy() {
this.iGood.buy();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
2、商品接口
package dependenceinversion;
/**
* 商品接口
*/
public interface IGood {
/**
* 购买商品
*/
void buy();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
3、冰箱商品
package dependenceinversion;
/**
* 冰箱商品
*/
public class FridgeGood implements IGood {
@Override
public void buy() {
System.out.println("购买冰箱");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
4、电视商品
package dependenceinversion;
/**
* 电视商品
*/
public class TelevisionGood implements IGood {
@Override
public void buy() {
System.out.println("购买电视");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
5、测试类
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();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
执行结果 :
购买冰箱
购买电视
- 1
- 2
五、依赖倒置原则代码示例 ( 推荐示例 | 使用 Setter 方法注入 IGood 实现类 )
1、顾客类
使用 Setter 方法注入 IGood 实现类 ;
package dependenceinversion;
public class Customer {
private IGood iGood;
public void setiGood(IGood iGood) {
this.iGood = iGood;
}
public void buy() {
this.iGood.buy();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
2、商品接口
package dependenceinversion;
/**
* 商品接口
*/
public interface IGood {
/**
* 购买商品
*/
void buy();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
3、冰箱商品
package dependenceinversion;
/**
* 冰箱商品
*/
public class FridgeGood implements IGood {
@Override
public void buy() {
System.out.println("购买冰箱");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
4、电视商品
package dependenceinversion;
/**
* 电视商品
*/
public class TelevisionGood implements IGood {
@Override
public void buy() {
System.out.println("购买电视");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
5、测试类
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();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
执行结果 :
购买冰箱
购买电视
- 1
- 2
文章来源: hanshuliang.blog.csdn.net,作者:韩曙亮,版权归原作者所有,如需转载,请联系作者。
原文链接:hanshuliang.blog.csdn.net/article/details/119877943
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)