本文是转载,且未获得原作者授权。
假设有一个磁盘接口,主要用来存储文件。
硬盘和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;