依赖关系是我们在做设计时经常遇到的,不可避免的问题;
本人根据学到的知识和工作中的经验,总结出如下几点规律,
与大家一同分享。一、依赖设计的原则 a.分层体系结构中,上层依赖下层,且最好依赖下层提供的接口
例如下图:
|-----------------------------------------|
| IA <-- Aimpl |
-------------------------------------------
| IB <---Bimpl |
-------------------------------------------
这是个两层结构系统,上层中包含接口IA和实现Aimpl;
下层中包含接口IB和实现Bimpl;
在设计依赖关系时, 正确的做法为:
Aimpl 依赖 IB
不好的作法为:
Aimpl 依赖 Bimpl
错误的作法为:
Bimpl 依赖 IA
Bimpl 依赖 Aimpl
b.同层中接口的实现依赖相对应接口,或者依赖同层其它接口,但尽量不要依赖同层实现
例如下图:
|-----------------------------------------|
| IA <-- Aimpl |
-------------------------------------------
| IB <---Bimpl IC<---Cimpl |
-------------------------------------------
请关注下层,下层包含接口IB,IC和实现Bimpl,Cimpl
其中Bimpl依赖IB,Cimpl依赖IC是正确的,也是很显然的,但是
其他正确的作法有:
Cimpl依赖IB且Bimpl不依赖IC
Bimpl依赖IC且Cimpl不依赖IB
错误的作法有:
Cimpl依赖Bimpl
Bimpl依赖Cimpl
Bimpl依赖IC且Cimpl依赖IB (接下来会讨论)
c.不要出现相互依赖
仍然以上图为例子说明,可能出现的错误情况有:
Bimpl依赖IC且Cimpl依赖IB
Bimpl依赖Cimpl且Cimpl依赖Bimpl 二、依赖的本质
依赖的本质是两者发生关系。
如果我们去邮局寄信,我们和邮局发生了关系,操作时要按照一定的规则去执行,而这个规则就是接口。
我们填写信封时,把收信人的地址写在上面,发信人地址写在下面,这些规则是邮局提供的,也就是
我们遵循了该规则。 规则制定者也可能是我们自己,例如我们故意把收信人写在下面,发信人写在上面,同时在信封上说明
我们使用的规则是收信人在下,发信人在上,即把该规则告诉邮局,让邮局按照我们的规则去送信,信同样
也是可以收到的。这时侯我们提供了接口,邮局要遵循我们的接口了。三、依赖的基本原理
a.对象等价于接口加实现,其中实现依赖接口
符号描述为: B 等于 IB<--Bimpl
b.依赖某对象等于依赖该对象的接口 A --> B 等于 A ---> (IB<--Bimpl) 又等于 A ---> IB
c.对象依赖等于对象实现的依赖 A--->B 等于 (IA<--Aimpl)-->B 又等于 Aimpl---> B 又等于 Aimpl--> (IB<--Bimpl) 又等于 Aimpl--->IB四、基本原理的应用 基本原理中我们可以看出:A --> B 等于 A ---> (IB<--Bimpl)
这就是依赖倒置DI(Dependency Inversion Principle) 依赖倒置可以解决上层实现依赖下层实现或同层间两实现依赖的问题,把A依赖B转化为:
A ---> IB
Bimpl ---> IB
转化前为:
|-----------------------------------------|
| A |
-------------------------------------------
| B |
-------------------------------------------
转换后为:
|-----------------------------------------|
| A |
-------------------------------------------
| IB <---Bimpl |
-------------------------------------------
这样的好处是:我们可以写另一个实现B2impl替代Bimpl,而对A没有任何影响。 在下一篇中我会谈谈高级原理。
本人根据学到的知识和工作中的经验,总结出如下几点规律,
与大家一同分享。一、依赖设计的原则 a.分层体系结构中,上层依赖下层,且最好依赖下层提供的接口
例如下图:
|-----------------------------------------|
| IA <-- Aimpl |
-------------------------------------------
| IB <---Bimpl |
-------------------------------------------
这是个两层结构系统,上层中包含接口IA和实现Aimpl;
下层中包含接口IB和实现Bimpl;
在设计依赖关系时, 正确的做法为:
Aimpl 依赖 IB
不好的作法为:
Aimpl 依赖 Bimpl
错误的作法为:
Bimpl 依赖 IA
Bimpl 依赖 Aimpl
b.同层中接口的实现依赖相对应接口,或者依赖同层其它接口,但尽量不要依赖同层实现
例如下图:
|-----------------------------------------|
| IA <-- Aimpl |
-------------------------------------------
| IB <---Bimpl IC<---Cimpl |
-------------------------------------------
请关注下层,下层包含接口IB,IC和实现Bimpl,Cimpl
其中Bimpl依赖IB,Cimpl依赖IC是正确的,也是很显然的,但是
其他正确的作法有:
Cimpl依赖IB且Bimpl不依赖IC
Bimpl依赖IC且Cimpl不依赖IB
错误的作法有:
Cimpl依赖Bimpl
Bimpl依赖Cimpl
Bimpl依赖IC且Cimpl依赖IB (接下来会讨论)
c.不要出现相互依赖
仍然以上图为例子说明,可能出现的错误情况有:
Bimpl依赖IC且Cimpl依赖IB
Bimpl依赖Cimpl且Cimpl依赖Bimpl 二、依赖的本质
依赖的本质是两者发生关系。
如果我们去邮局寄信,我们和邮局发生了关系,操作时要按照一定的规则去执行,而这个规则就是接口。
我们填写信封时,把收信人的地址写在上面,发信人地址写在下面,这些规则是邮局提供的,也就是
我们遵循了该规则。 规则制定者也可能是我们自己,例如我们故意把收信人写在下面,发信人写在上面,同时在信封上说明
我们使用的规则是收信人在下,发信人在上,即把该规则告诉邮局,让邮局按照我们的规则去送信,信同样
也是可以收到的。这时侯我们提供了接口,邮局要遵循我们的接口了。三、依赖的基本原理
a.对象等价于接口加实现,其中实现依赖接口
符号描述为: B 等于 IB<--Bimpl
b.依赖某对象等于依赖该对象的接口 A --> B 等于 A ---> (IB<--Bimpl) 又等于 A ---> IB
c.对象依赖等于对象实现的依赖 A--->B 等于 (IA<--Aimpl)-->B 又等于 Aimpl---> B 又等于 Aimpl--> (IB<--Bimpl) 又等于 Aimpl--->IB四、基本原理的应用 基本原理中我们可以看出:A --> B 等于 A ---> (IB<--Bimpl)
这就是依赖倒置DI(Dependency Inversion Principle) 依赖倒置可以解决上层实现依赖下层实现或同层间两实现依赖的问题,把A依赖B转化为:
A ---> IB
Bimpl ---> IB
转化前为:
|-----------------------------------------|
| A |
-------------------------------------------
| B |
-------------------------------------------
转换后为:
|-----------------------------------------|
| A |
-------------------------------------------
| IB <---Bimpl |
-------------------------------------------
这样的好处是:我们可以写另一个实现B2impl替代Bimpl,而对A没有任何影响。 在下一篇中我会谈谈高级原理。
解决方案 »
- 【求助】ssh 查询 视图 时快时慢 查了2天都没找出问题
- jsp 脚本调用exe程序
- 面试软件测试工程师要做好那些准备?有经验的老手给的意见。急~~~~~~
- "/"与"\"都用在什么场合 区分???
- 关于对SSH项目进行Junit单元测试的问题
- struts,hibernate,spring,求 书籍推荐
- struts编写的B/S程序使用tomcat做服务器有时会无法访问????急!!!!
- 用jsch实现SFTP上传文件 出异常failed to send channel request
- java 大文本存储 、分页、查询
- Java怎么用二维数组输出这种类型的三角形呢?
- wwwwwwwwwwwwwwwwwwwww
- 谁推荐个java邮件客户端程序源码学习下
例如下图:
¦----------------------------------------- ¦
¦ IA <-- Aimpl ¦
-------------------------------------------
¦ IB <---Bimpl ¦
-------------------------------------------
这是个两层结构系统,上层中包含接口IA和实现Aimpl;
下层中包含接口IB和实现Bimpl;
在设计依赖关系时, 正确的做法为:
Aimpl 依赖 IB
应该是IA把而不是IB