还记得Windows系统右键菜单中的“刷新”吗?通过FPT传输一个文件至某个目录后,还需要手动刷新一下文件窗口才能看到文件,而在Linux系统中确不存在这样的问题。在解答之前,我们先来看看《观察者模式》
观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
模式中涉及的角色(对象类型):
package sample; import java.util.List; public interface Subject { public void addObserver(Observer observer); public void removeObserver(Observer observer); public void notifyObservers(List<String> files); }
package sample; import java.util.LinkedList; import java.util.List; public class FileSystem implements Subject { private List<String> files = new LinkedList<String>(); private List<Observer> observers = new LinkedList<Observer>(); @Override public void addObserver(Observer observer) { this.observers.add(observer); } @Override public void removeObserver(Observer observer) { this.observers.remove(observer); } @Override public void notifyObservers(List<String> files) { for (Observer observer : observers) { observer.update(files); } } public void addFile(String file) { files.add(file); this.notifyObservers(files); } public void delFile(String file) { files.remove(file); this.notifyObservers(files); } }
package sample; import java.util.List; public interface Observer { public void update(List<String> files); }
package sample; import java.util.List; public class FileBrowser implements Observer { @Override public void update(List<String> files) { this.display(files); } private void display(List<String> files) { for (String file : files) { System.out.print(file); System.out.print("\t\t"); } } }
package sample; public class App { public static void main(String[] args) { Observer window = new FileBrowser(); FileSystem fileSystem = new FileSystem(); fileSystem.addObserver(window); fileSystem.addFile("file1"); System.out.println("\n==========\n"); fileSystem.addFile("file2"); System.out.println("\n==========\n"); fileSystem.addFile("file3"); System.out.println("\n==========\n"); fileSystem.delFile("file1"); } } //输出结果如下 file1 ========== file1 file2 ========== file1 file2 file3 ========== file2 file3
JDK中使用观察者设计的部分有哪些?
原文地址:http://blog.csdn.net/oyl822/article/details/42875539