一.设计理念:
相对于细节的多变,抽象的东西更稳定。抽象指的是:抽象类和接口。细节就是具体实现的类。
基本概念:
- 高层模块不应依赖底层模块,二者都应该依赖其抽象。
- 抽象不应该依赖细节,细节应该依赖抽象。
- 中心思想面向接口编程。
public class DependenceInversion {
public static void main(String[] args) {
Persion persion = new Persion();
persion.receive(new Email());
}
}
class Email {
public String getInfo() {
return "电子邮件信息: hello,world";
}
}
class Persion {
public void receive(Email email) {
System.out.println(email.getInfo());
}
}
运行结果:电子邮件信息: hello,world
分析:可以看到这是一个发送消息的类,方式是通过电子邮件。但是如果我们想用其他方式去发送信息,比如微信等。只能通过添加一个类来实现。
思路:可以使用接口。
public class DependenceInversionImp {
public static void main(String[] args) {
Persions persions = new Persions();
persions.receive(new Emails());
persions.receive(new WeiXin());
}
}
//定义接口
interface IReceiver {
public String getInfo();
}
class Emails implements IReceiver {
public String getInfo() {
return "电子邮件信息: hello,world";
}
}
//增加微信
class WeiXin implements IReceiver {
public String getInfo() {
return "微信信息: hello,ok";
}
}
class Persions {
public void receive(IReceiver iReceiver) {
System.out.println(iReceiver.getInfo());
}
}
运行结果:电子邮件信息: hello,world
微信信息: hello,ok
分析:这里使用IReceiver接口抽象出发送消息的实体类。Persion类中只用接收接口的引用,就可以获取具体消息的传递方式。
最后再来看看:依赖传递的三种方式
/**
* 依赖传递方式
*/
public class DependencePass {
public static void main(String[] args) {
OpenAndCloseSet openAndClose = new OpenAndCloseSet();
openAndClose.set(new ChangHong());
openAndClose.open();
}
}
//接口传值
interface Tv {
public void play();
}
interface IOpenAndClose {
public void open(Tv tv); // 抽象方法,接收接口
}
class ChangHong implements Tv {
public void play() {
System.out.println("长虹电视打开");
}
}
class OpenAndClose implements IOpenAndClose {
public void open(Tv tv) {
tv.play();
}
}
//构造函数传值
interface TvFun {
public void play();
}
interface IOpenAndCloseFun {
public void open();
}
class OpenAndCloseFun implements IOpenAndCloseFun {
private Tv tv;
public OpenAndCloseFun(Tv tv) {
this.tv = tv;
}
public void open() {
tv.play();
}
}
//set方法传值
interface TvSet {
public void play();
}
interface IOpenAndCloseSet {
public void open();
}
class OpenAndCloseSet implements IOpenAndCloseSet {
private Tv tv;
public void set(Tv tv) {
this.tv = tv;
}
public void open() {
tv.play();
}
}