观察者模式:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知,并自动更新。
针对接口编程,不针对实现编程,为交互对象之间的松耦合设计而努力。
/**
*观察者订阅的主题
*/
public interface Subject {
public void addObserver(Observer observer);
public void deleteObserver(Observer observer);
public void notifyAllObserver();
}
/**
* 主题实现类
*/
public class SubjectAchieve implements Subject {
private List<Observer> observerList;
private boolean changed = false;//主要用于控制订阅发布的粒度控制
private User user;
public SubjectAchieve() {
observerList = new ArrayList<Observer>();
}
@Override
public void addObserver(Observer observer) {
observerList.add(observer);
}
@Override
public void deleteObserver(Observer observer) {
observerList.remove(observer);
}
@Override
public void notifyAllObserver() {
if (changed) {
for (Observer observer : observerList) {
observer.update(user);
}
changed = false;
}
}
public void setUser(User user) {
this.user = user;
}
public void setChanged(boolean changed) {
this.changed = changed;
}
}
//观察者接口
public interface Observer {
public void update(User user);
}
//观察者实现类
public class ObserverAchieve implements Observer {
private Subject subject;
public ObserverAchieve(Subject subject) {
this.subject = subject;
subject.addObserver(this);
}
@Override
public void update(User user) {
System.out.println("age:" + user.getAge() + "\tname:" + user.getName());
}
}
//又一观察者实现类
public class ObserverAcnieveOther implements Observer {
private Subject subject;
public ObserverAcnieveOther(Subject subject) {
this.subject = subject;
subject.addObserver(this);
}
@Override
public void update(User user) {
System.out.println("ageOther:" + user.getAge() + "\tnameOther:" + user.getName());
}
}
/**
* 主题将此的变化通知给观察者
*/
public class User {
private int age;
private String name;
public User() {}
public User(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
//测试类
public class Test {
public static void main(String[] args) {
SubjectAchieve subject = new SubjectAchieve();
Observer observer = new ObserverAchieve(subject);
Observer observer1 = new ObserverAcnieveOther(subject);
subject.setChanged(true);
User user = new User(12, "xxx");
subject.setUser(user);
subject.notifyAllObserver();
}
}
//结果:
age:12 name:xxx
ageOther:12 nameOther:xxx
原文:http://www.cnblogs.com/fanguangdexiaoyuer/p/5786890.html