还记得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