文章目录
依赖倒置原则问题描述解决思路代码实现传统方式依赖倒置_接口传递实现依赖依赖倒置_构造方法传递实现依赖依赖倒置_Setter方法传递实现依赖
注意事项
依赖倒置原则
依赖倒置原则(Dependence Inversion Principle)
高层模块不应该依赖底层模块,二者都应该依赖其抽象抽象不应该依赖细节,细节应该依赖抽象依赖倒置的中心思想是面向接口编程依赖倒置原则是基于这样的设计理念:相对于细节的多边形,抽象的东西要稳定的多.以抽象为基础 搭建的架构比以细节为基础的架构要稳定的多.在java中,抽象是指接口或抽象类,细节就是具体的实现类使用接口或抽象类的目的是定制好规范,而不设计任何具体的操作,把展现细节的任务交给他们的实现类去完成
问题描述
类A直接依赖类B,如果要将类B改为依赖类C,则必须通过修改类A的代码来达成,这种情况下类A一般是高层模块,负责复杂的业务逻辑;类B 和类C是低层模块,负责基本的原子操作;假设修改类A,会给程序带来不必要的风险
解决思路
将类A修改为依赖接口interface,类B和类C各自实现接口interface,类A通过接口interface间接与类B或者类C发生联系, 则会大大降低修改类A的几率。
代码实现
传统方式
public class DependecyInversion {
public static void main(String
[] args
) {
new Person().receiver(new Email());
}
}
class Email{
public String
getInfo(){
return "Email Message";
}
}
class Person{
void receiver(Email email
){
System
.out
.println(email
.getInfo());
}
}
依赖倒置_接口传递实现依赖
public class DependecyInversion {
public static void main(String
[] args
) {
new Person().receiver(new Email());
new Person().receiver(new WeChat());
}
}
class Email implements SendMessage{
public String
getInfo(){
return "Email Message";
}
}
class WeChat implements SendMessage{
public String
getInfo() {
return "WeChat Message";
}
}
class Person{
void receiver(SendMessage send
){
System
.out
.println(send
.getInfo());
}
}
interface SendMessage{
String
getInfo();
}
依赖倒置_构造方法传递实现依赖
public class DependecyInversion {
public static void main(String
[] args
) {
new Person(new Email()).receiver();
new Person(new WeChat()).receiver();
}
}
class Email implements SendMessage{
public String
getInfo(){
return "Email Message";
}
}
class WeChat implements SendMessage{
public String
getInfo() {
return "WeChat Message";
}
}
class Person{
private SendMessage send
;
public Person(SendMessage send
){
this.send
=send
;
}
void receiver(){
System
.out
.println(send
.getInfo());
}
}
interface SendMessage{
String
getInfo();
}
依赖倒置_Setter方法传递实现依赖
public class DependecyInversion {
public static void main(String
[] args
) {
new Person().setSend(new Email()).receiver();
new Person().setSend(new WeChat()).receiver();
}
}
class Email implements SendMessage{
public String
getInfo(){
return "Email Message";
}
}
class WeChat implements SendMessage{
public String
getInfo() {
return "WeChat Message";
}
}
class Person{
private SendMessage send
;
public Person
setSend(SendMessage send
) {
this.send
= send
;
return this;
}
void receiver(){
System
.out
.println(send
.getInfo());
}
}
interface SendMessage{
String
getInfo();
}
注意事项
1. 低层模块尽量都要有抽象类或接口
,或者两者都有
,程序稳定性更好
2. 变量的声明乐行尽量是抽象类或接口
,这样我们的变量引用和实际对象间
,就存在一个缓冲层
,利于程序扩展和优化
3. 继承时遵循里氏替换原则