这个帖子中谈谈依赖原理的高级原理和使用技巧。一、依赖原理的高级原理
1.A依赖B可转化为B依赖A
符号表示为:A --> B ==> B ---> A 哪个依赖哪个,这个其实跟规则的制定者有关系;同样拿邮局寄信的问题来说,
如果按照邮局接口,则我们依赖邮局,
如果按照我们自定义接口,则邮局依赖我们;
但是不管谁依赖谁,我们达到同样的目的,那就是把信寄出去。二、依赖原理的高级技巧 其实我们谈论的这个高级技巧,就是控制反转IOC。
解决的问题就是相互依赖的问题,例如A --> B 同时 B ---> A
我们可以把 A --> B 等价于 A --> IB1
把 B ---> A 等价于 A --> IB2
这就是说把A向B,B向A各制定一个规则转化为B向A制定两个规则;二、依赖原理的高级技巧的例子 拿我们去邮局做例子,有两个类PostOfficeMail和PostOffice如下:
#PostOffice
class PostOffice{
public void sendMail( Mail mail ){
//按照邮局制定规则,从信封上面获取目的地址
。
//发送到目的地址
sendThisMail.....
}
}
#PostOfficeMail
class PostOfficeMail extends Mail{
//上面记录收件人,下面记录发件人
}
#Test
class Test{
public static void main(String []args){
PostOffice postOffice = new PostOffice();
Mail mail = new PostOfficeMail();
//按照邮局规则,把收件人地址写在上面
。
postOffice.sendMail( mail );
}
}
如果使用IOC,PostOffice将依赖Mail.
#IDestAddress
interface IDestAddress{
Address getDestAddress();
}
#PostOffice
class PostOffice{
public void sendMail( Mail mail, IDestAddress destAddress){
//使用传入的IDestAddress获取目的地址
Address address = destAddress.getDestAddress;
//把地址发送到目的地
}
}
#PostOfficeMail
class MyMail extends Mail implements IDestAddress{
//下面记录收件人,上面记录发件人,使用自己的规则
.......
//实现getDestAddress
Address getDestAddress(){
//从信封下面获取目的地址
。。
}
}
#Test
class Test{
public static void main(String []args){
PostOffice postOffice = new PostOffice();
PostOfficeMail mail = new PostOfficeMail();
//按照邮局规则,把收件人地址写在上面
。
postOffice.sendMail( mail,mail );
}
}三、思考的问题 如果有如下同层间的依赖关系,我们该如果做?
A --> B B --> C C--->A C --->B
1.A依赖B可转化为B依赖A
符号表示为:A --> B ==> B ---> A 哪个依赖哪个,这个其实跟规则的制定者有关系;同样拿邮局寄信的问题来说,
如果按照邮局接口,则我们依赖邮局,
如果按照我们自定义接口,则邮局依赖我们;
但是不管谁依赖谁,我们达到同样的目的,那就是把信寄出去。二、依赖原理的高级技巧 其实我们谈论的这个高级技巧,就是控制反转IOC。
解决的问题就是相互依赖的问题,例如A --> B 同时 B ---> A
我们可以把 A --> B 等价于 A --> IB1
把 B ---> A 等价于 A --> IB2
这就是说把A向B,B向A各制定一个规则转化为B向A制定两个规则;二、依赖原理的高级技巧的例子 拿我们去邮局做例子,有两个类PostOfficeMail和PostOffice如下:
#PostOffice
class PostOffice{
public void sendMail( Mail mail ){
//按照邮局制定规则,从信封上面获取目的地址
。
//发送到目的地址
sendThisMail.....
}
}
#PostOfficeMail
class PostOfficeMail extends Mail{
//上面记录收件人,下面记录发件人
}
#Test
class Test{
public static void main(String []args){
PostOffice postOffice = new PostOffice();
Mail mail = new PostOfficeMail();
//按照邮局规则,把收件人地址写在上面
。
postOffice.sendMail( mail );
}
}
如果使用IOC,PostOffice将依赖Mail.
#IDestAddress
interface IDestAddress{
Address getDestAddress();
}
#PostOffice
class PostOffice{
public void sendMail( Mail mail, IDestAddress destAddress){
//使用传入的IDestAddress获取目的地址
Address address = destAddress.getDestAddress;
//把地址发送到目的地
}
}
#PostOfficeMail
class MyMail extends Mail implements IDestAddress{
//下面记录收件人,上面记录发件人,使用自己的规则
.......
//实现getDestAddress
Address getDestAddress(){
//从信封下面获取目的地址
。。
}
}
#Test
class Test{
public static void main(String []args){
PostOffice postOffice = new PostOffice();
PostOfficeMail mail = new PostOfficeMail();
//按照邮局规则,把收件人地址写在上面
。
postOffice.sendMail( mail,mail );
}
}三、思考的问题 如果有如下同层间的依赖关系,我们该如果做?
A --> B B --> C C--->A C --->B
C--->A C --->B
可以抽象C