定义一个接口 磁盘

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吧 软件设计程序的基本思想是,当需求改变的时候,我们的应用程序改变最小

最新文章

  1. Vmware10如何打开vmware11建立的虚拟机
  2. java中的IO操作总结
  3. c#执行Dos命令
  4. php按址传递bug
  5. Oracle EBS-SQL (PO-12):检查期间请购单的下达记录数.sql
  6. LSH算法原理
  7. db2常用命令(详解)大全
  8. IOS 与ANDROID框架及应用开发模式对照一
  9. leetcode第13题--Roman to Integer
  10. dapper 可空bool转换出错及解决方案
  11. ecos 问题答疑(转)
  12. PHP 页面缓冲函数
  13. WPScan初体验
  14. 老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例
  15. python 标准库 -- requests
  16. LGTB 与序列
  17. Android版数据结构与算法(三):基于链表的实现LinkedList源码彻底分析
  18. C# 利用反射动态给模型Model 赋值
  19. C#清除HTML样式
  20. 单点登录--CAS认证--web.xml配置详解

热门文章

  1. 在Linux下解压xz压缩文件
  2. 21个CSS技巧
  3. PHP算法之删除最外层的括号
  4. php 引用文件
  5. [JZOJ3347] 【NOI2013模拟】树的难题
  6. 【JZOJ6275】小L的数列
  7. 「题解」:$e$
  8. C++访问sqlite3的初体验
  9. POJ-2752-Seek the Name-kmp的变形
  10. c++ const的用法