接口为什么可以解耦

本文是转载,且未获得原作者授权。
假设有一个磁盘接口,主要用来存储文件。
硬盘和U盘都实现了这个接口

// 定义一个接口 磁盘
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类不依赖于任何具体的类,这样就解除了与任何具体存储设备的耦合!
	  */
	
	/// 文章有删改,文末有原文地址
  }

笔者自己的理解:
接口可以看作是一种标准,我们在使用接口时,并不知道接口要被那个类实现。我们只是用接口定下一个标准,所有实现这个和接口的类都必须遵守这个标准。那上文来说,download类在声明时用的是接口,这样无论哪个类去调用这个下载类,只要改变接口声明的实例(setDisk方法),就可以实现不同的功能。

原作者:xiukongtiao;
原文地址:https://bbs.csdn.net/topics/370098383?list=16125326;

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值