依赖关系是我们在做设计时经常遇到的,不可避免的问题;
本人根据学到的知识和工作中的经验,总结出如下几点规律,
与大家一同分享。一、依赖设计的原则  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没有任何影响。    在下一篇中我会谈谈高级原理。
      
   

解决方案 »

  1.   

    学习了,有的地方怎么看不太明白呢一、依赖设计的原则     a.分层体系结构中,上层依赖下层,且最好依赖下层提供的接口 
            例如下图: 
              ¦----------------------------------------- ¦ 
            ¦                         IA       <--   Aimpl                               ¦ 
            ------------------------------------------- 
            ¦                         IB       <---Bimpl                               ¦ 
            ------------------------------------------- 
            这是个两层结构系统,上层中包含接口IA和实现Aimpl; 
                                                下层中包含接口IB和实现Bimpl; 
            在设计依赖关系时,           正确的做法为: 
                                        Aimpl   依赖     IB 
    应该是IA把而不是IB
      

  2.   

    Aimpl依赖IA那是一定的。下层接口是提供给上层实现用的,所以IB是提供给Aimpl用的。因此Aimpl依赖IB是正确的做法。