设计模式之观察者模式
观察者对象Observer
目标对象Subject
观察者设计模式适用于用户订阅栏目,然后在每次发布新消息的时候自动给订阅用户发送消息。我这里拿天气预报做例子,天气
作为目标对象
,市民
作为观察者对象
每次在天气预报更新天气信息后,自动给订阅的市民推送天气预报
直接上代码
目标对象接口(Subject )
public interface Subject {
void attach(Observer o);
void remove(Observer o);
void notifyObservers(String subjectState);
}
目标对象类(SubjectImpl )实现目标对象接口
import java.util.ArrayList;
import java.util.List;
public class SubjectImpl implements Subject {
private List<Observer> observerList=new ArrayList<Observer>();
private String subjectState;
@Override
public void attach(Observer o) {
observerList.add(o);
}
@Override
public void remove(Observer o) {
observerList.remove(o);
}
@Override
public void notifyObservers(String subjectState) {
System.out.println("目标对象发送消息:"+subjectState);
for (Observer o : observerList) {
o.update(subjectState);
}
}
public SubjectImpl() {
super();
}
public String getSubjectState() {
return subjectState;
}
public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
notifyObservers(subjectState);
}
}
观察者对象接口(Observer)
public interface Observer {
void update(String subjectState);
}
观察者对象类(ObserverImpl )实现观察者对象接口
public class ObserverImpl implements Observer {
private String name;
private String observerState;
@Override
public void update(String subjectState) {
setObserverState(subjectState);
}
public ObserverImpl() {
super();
}
public ObserverImpl(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getObserverState() {
return observerState;
}
public void setObserverState(String observerState) {
this.observerState = observerState;
System.out.println("观察者对象"+name+"接收到了:"+observerState);
}
}
测试观察者模式
public class TestObserverPattern {
public static void main(String[] args) {
ObserverImpl observer=new ObserverImpl("林飞凤");
ObserverImpl observer2=new ObserverImpl("涂志海");
SubjectImpl subject=new SubjectImpl();
subject.attach(observer);
subject.attach(observer2);
subject.setSubjectState("厦门天气预报:今天多云,局部可能会有中雨,请做好下雨措施");
}
}
结果:
目标对象发送消息:厦门天气预报:今天多云,局部可能会有中雨,请做好下雨措施
观察者对象林飞凤接收到了:厦门天气预报:今天多云,局部可能会有中雨,请做好下雨措施
观察者对象涂志海接收到了:厦门天气预报:今天多云,局部可能会有中雨,请做好下雨措施
自己的一点点理解,如有不对,欢迎指正。