• 接口Interface解耦的理解


    定义一个接口 磁盘
    interface Disk(){
      void save(File file);  
    }
    U盘和硬盘都是磁盘,都实现这个接口
    class UDisk implement Disk{
     void save(File file);  
    }


    class HardDisk implement Disk{
     void save(File file);  
    }

    一个需要用磁盘来存储的下载工具
    class Download{
      Disk disk;//用接口声明,我们不知道,也不用知道,我们未来会存到什么样的磁盘,我们不依赖于任何类型的磁盘,我们只依赖于这个接口


      void download(File file){
           disk.save(file);
      }
        
      void setDisk(Disk disk){
      this.disk=disk;
      }

      public static void main(String[] args){
      Download download = new Download();
      设置存储目标为U盘
      download.setDisk(new UDisk());
      文件被存到了U盘
      download.download(file);

      设置存储目标为硬盘
      download.setDisk(new HardDisk());
      文件被存到了硬盘
      download.download(file);

    某天我们想把下载的文件保存到CD里边,我们只需要定义CDDisk类,实现Disk接口就可以不对download本身做任何修改,就可以方便的将文件下载到CD或其他介质里。我们的Download类不依赖于任何具体的类,这样就接触了与任何具体存储设备的耦合!
      }}

    耦合就是两个层之间有依赖关系?
    ==
    同一个层也可能有依赖关系
    
    看见有解耦的方法就是在相互依赖的两层之间加一层,可是新加的一层不是又和原来的两层有耦合关系了吗?
    ==
    解耦的方式是让设计依赖于抽象,而不是依赖于实现,看看设计模式的原则
    
    到底什么是耦合??
    ==
    A明确地使用B资源
    
    publci class A
    {
             B b;
    }
    
    public class B
    {
    
    }
    
    现在A依赖于B
    
    interface IX
    {
    ...
    }
    
    public class A
    {
          IX i;
           public A(IX  i)
          {
                  this.i = i;
          }       
    }
    
    public class B:IX
    {
    
    }
    
    调用的时候,我可以决定用哪个实现接口的类,甚至可以是从配置文件反射生成
    
    A  a = new A(new B());
    也可能因为某个条件
    A  a = new A(new C());
    
    这样 A依赖的是抽象的接口IX,而不是具体的类B或者C

    追问

    恕小弟愚昧,弱弱的问下,这里所说的“依赖抽象的接口不依赖现实”,是不是说不管类B,类C编译的版本怎么变,但始终可以调用接口来调用类B,类C,所以类A不用编译了?

    回答

    1. 如果B发生了修改,那我们可以使用C,因为我们依赖的是接口,而不是具体的类(对象) 
    打个比方,汽车制造者可以依赖于轮胎这个抽象的东西,但不能依赖于具体的品牌比如"风神轮胎"
    
    2. 当需求改变的时候,我们需要修改的只有Main函数所在的类(甚至它都可能不用修改,只需要修改配置文件就可以)。
    重新编译程序的代价很大,打个比方,windows有更新了,只是提供补丁,而不是给一版新的windows吧
    
    软件设计程序的基本思想是,当需求改变的时候,我们的应用程序改变最小
  • 相关阅读:
    ssh访问控制,多次失败登录即封掉IP,防止暴力破解
    经常用到的一些命令行
    自定义控件
    委托线程三部曲(引用)
    关于委托
    三个调用的例子(转)
    同一网段的两台电脑通信(转)
    SOCKET原理(转载)
    C#winform和百度API互动-----之JS读取中C#中的函数
    C#winform和百度API互动-----之读取中js的参数
  • 原文地址:https://www.cnblogs.com/kevinWu7/p/10163439.html
Copyright © 2020-2023  润新知