观察者模式:
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
自己的理解:观察者模式相当于书刊==》订阅者这种类型,比如说:我订阅了一本《读者》,然后读者每发行一版就会给我发送一次新的周刊。
类图:(上一个策略模式的类图是自己随意画的,很不好,还是找的一个,看来以后的将UML也学习一番了。)
下面我们来看代码:
主题接口:
public interface Subject {
void addObserver(Observer obs);
void removeObserver(Observer obs);
void notifyObserver();
}
主题接口设计三个方法:
一个为注册观察者方法addObserver(Observer obs),一个为 注销观察者方法:removeObserver(Observer obs);最后一个为提醒观察者:notifyObserver();
主题实现类:
public class ConcreteSubject implements Subject {
private String state = "this is ConcreteSubject state";
private List<Observer> observerList=new ArrayList<Observer>();
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
@Override
public void addObserver(Observer obs) {
// TODO Auto-generated method stub
this.observerList.add(obs);
}
@Override
public void removeObserver(Observer obs) {
// TODO Auto-generated method stub
this.observerList.remove(obs);
}
@Override
public void notifyObserver() {
// TODO Auto-generated method stub
for (Observer obs: observerList) {
obs.action(state);
}
}
}
抽象观察者:
public interface Observer {
void action(String state);
}
抽象观察者主要用于执行观察者的共同方法
实例观察者:
public class ConcreteObserver implements Observer {
@Override
public void action(String state) {
// TODO Auto-generated method stub
System.out.println(state);
}
}
实例观察者用来实现相应的方法。
下面我们来看实现代码:
public class ObserverTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ConcreteSubject sub = new ConcreteSubject();
Observer observer = new ConcreteObserver();
sub.addObserver(observer);
sub.notifyObserver();
sub.setState("this is the changed");
sub.notifyObserver();
sub.removeObserver(observer);
sub.notifyObserver();
}
}
开始的时候,我们提到书刊订阅,这种是书刊主动推送,如果读者想自己取是不是会更好呢?观察者模式中恰好就有这种类型。我们一般将上面的例子称为推模式,而接下来的这种称为拉模式。代码如下:
主题接口:
public interface Subject {
void addObserver(Observer obs);
void removeObserver(Observer obs);
void notifyObserver();
}
主题接口设计三个方法:
一个为注册观察者方法addObserver(Observer obs),一个为 注销观察者方法:removeObserver(Observer obs);最后一个为提醒观察者:notifyObserver();
主题实现类:
public class ConcreteSubject implements Subject {
private String state = "this is ConcreteSubject state";
private List<Observer> observerList=new ArrayList<Observer>();
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
@Override
public void addObserver(Observer obs) {
// TODO Auto-generated method stub
this.observerList.add(obs);
}
@Override
public void removeObserver(Observer obs) {
// TODO Auto-generated method stub
this.observerList.remove(obs);
}
@Override
public void notifyObserver() {
// TODO Auto-generated method stub
for (Observer obs: observerList) {
obs.action(this);
}
}
}
抽象观察者:
public interface Observer {
void action(ConcreteSubject concreteSubject );
}
抽象观察者主要用于执行观察者的共同方法
实例观察者:
public class ConcreteObserver implements Observer {
@Override
public void action(ConcreteSubject concreteSubject) {
// TODO Auto-generated method stub
System.out.println(concreteSubject.getState());
}
}
实例观察者用来实现相应的方法。
下面我们来看实现代码:
public class ObserverTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ConcreteSubject sub = new ConcreteSubject();
Observer observer = new ConcreteObserver();
sub.addObserver(observer);
sub.notifyObserver();
sub.setState("this is the changed");
sub.notifyObserver();
sub.removeObserver(observer);
sub.notifyObserver();
}
}
ok,今天的分享就到这里了。
另外,java内部也有观察者模式的相关类,大家可以网上查相关资料,我这里就不赘述了。
欢迎大家来拍砖,有什么好的建议也可以留言,大家一起学习哈。。。