《商务网站开发》 实训报告书,扬州有做义工的地方或网站嘛,网站定位策划书,广州网站设计素材目录 1、 基本介绍
2、 应用实例
3、 依赖关系传递的三种方式
(1) 接口传递
(2) 构造方法传递
(3) setter方式传递
4、 注意事项和细节 1、 基本介绍 依赖倒转原则(Dependence Inversion Principle)是指#xff1a;
高层模块不应该依赖低层模块#xff0c;二者都应该依…目录 1、 基本介绍
2、 应用实例
3、 依赖关系传递的三种方式
(1) 接口传递
(2) 构造方法传递
(3) setter方式传递
4、 注意事项和细节 1、 基本介绍 依赖倒转原则(Dependence Inversion Principle)是指
高层模块不应该依赖低层模块二者都应该依赖其抽象(抽象类/接口)不要去依赖一个具体的子类 抽象不应该依赖细节细节应该依赖抽象这样稳定性会比较好 依赖倒转(倒置)的中心思想是面向接口编程 依赖倒转原则是基于这样的设计理念相对于细节的多变性抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在 java 中抽象指的是接口或抽象类细节就是具体的实现类 使用接口或抽象类的目的是制定好规范而不涉及任何具体的操作把展现细节的任务交给他们的实现类去完成接口和抽象类的价值在于设计 2、 应用实例 编程完成Person接收消息的功能。
(1) 传统方式
package com.principle.inversion;
public class DependecyInversion1 {public static void main(String[] args) {Person person new Person();person.receive(new Email());}
}class Email{public String getInfo() {return 电子邮件信息hello world;}
}
//方式一分析
//1.优点简单容易想到容易实现
//2.缺点如果我们获取的对象是 微信、短信等等则需要新增类同时Person也需要增加相应的接收方法扩展性不好
//3.解决思路引入一个抽象的接口IReceiver表示接收者这样Person类与接口IReceiver发生依赖
// 因为EmailWeiXin等等都属于接收的范畴它们各自实现IReceiver接口就可以了这样就符合了依赖倒转原则class Person{public void receive(Email email) {System.out.println(email.getInfo());}
}
(2) 改进方式
package com.principle.inversion;
public class DependecyInversion1Improve {public static void main(String[] args) {//客户端无需改变Person person new Person();person.receive(new Email());person.receive(new WeChat());}
}interface IReceiver{public String getInfo();
}class Email implements IReceiver{public String getInfo() {return 电子邮件信息hello world;}
}class WeChat implements IReceiver{public String getInfo() {return 微信消息hello;}
}class Person{public void receive(IReceiver receiver) {System.out.println(receiver.getInfo());}
}
3、 依赖关系传递的三种方式 (1) 接口传递
public class DependencyPass {public static void main(String[] args) {ChangHong changHong new ChangHong();OpenAndClose openAndClose new OpenAndClose();openAndClose.open(changHong);}
}// 方式 1 通过接口传递实现依赖
// 开关的接口
interface IOpenAndClose {public void open(ITV tv); // 抽象方法,接收接口
}interface ITV { // ITV 接口public void play();
}class ChangHong implements ITV {Overridepublic void play() {System.out.println(长虹电视机打开);}
}
// 实现接口
class OpenAndClose implements IOpenAndClose {public void open(ITV tv) {tv.play();}
} (2) 构造方法传递
public class DependencyPass {public static void main(String[] args) {ChangHong changHong new ChangHong();//通过构造器进行依赖传递OpenAndClose openAndClose new OpenAndClose(changHong);openAndClose.open();}
}
// 方式 2: 通过构造方法依赖传递
interface IOpenAndClose {public void open(); // 抽象方法
}interface ITV { // ITV 接口public void play();
}class OpenAndClose implements IOpenAndClose {public ITV tv; // 成员public OpenAndClose(ITV tv) { // 通过构造器将接口传入this.tv tv;}public void open() { this.tv.play(); }
}class ChangHong implements ITV {Overridepublic void play() {System.out.println(长虹电视机打开);}
} (3) setter方式传递
public class DependencyPass {public static void main(String[] args) {ChangHong changHong new ChangHong();//通过 setter 方法进行依赖传递OpenAndClose openAndClose new OpenAndClose();openAndClose.setTv(changHong);openAndClose.open();//没有setTv()直接open()就会报空指针异常}
}
// 方式 3 , 通过 setter 方法传递
interface IOpenAndClose {public void open(); // 抽象方法public void setTv(ITV tv);
}interface ITV { // ITV 接口public void play();
}class OpenAndClose implements IOpenAndClose {private ITV tv;public void setTv(ITV tv) { this.tv tv; }public void open() { this.tv.play(); }
}class ChangHong implements ITV {Overridepublic void play() {System.out.println(长虹电视机打开);}
}
4、 注意事项和细节 1低层模块尽量都要有抽象类或接口或者两者都有程序稳定性更好.
2变量的声明类型尽量是抽象类或接口, 这样我们的变量引用和实际对象间就存在一个缓冲层利于程序扩展和优化
比如class A extends B{}其中B是一个抽象类/接口在使用时B obj new A()如果A类要进行扩展只需要在B中增加一个方法即可。
3继承时遵循里氏替换原则