当一个对象的状态等值发生改变时,需要告知其他对象,这就需要用到观察者模式。一个被观察者可以对应多个观察者。
以下面的例子,主要有四个类,分别是:
- 抽象的观察者
Observer
这里用一个接口来表示,通常用接口或者抽象类 - 抽象的被观察者
Subject
- 具体的观察者
UseObserver
重写父类接口中的方法 - 具体的被观察者
UseSubject
继承自Subject
下面就来看具体的实例来方便理解这一设计模式:
首先创建Observer.class
,在这里定义一个getMessage()
方法,后面用于在观察者中接收被观察者发来的更新信息
//观察者
public interface Observer {
// public void update();
public void getMessage(String msg);
}
然后创建抽象的被观察者对象Subject.class
, 在这个类中创建add()
和remove()
方法,用于向观察者列表添加和删除观察者对象。其次,notifiy()
方法的作用是遍历当前的观察者列表并且调用观察者的getMessage()
方法
public class Subject {
//被观察者
public List<Observer> list = new ArrayList<Observer>();
public void add(Observer observer) {
list.add(observer);
}
public void remove(Observer observer) {
list.remove(observer);
}
public void notifiy(String msg) {
for(Observer observer : list) {
// observer.update();
observer.getMessage(msg);
}
}
}
接下来创建具体的观察者和被观察者。在UseObserver
中重写getMessage()
方法并且读取观察者发送的这个消息
public class UseObserver implements Observer{
private String name;
private String message;
public UseObserver(String name) {
this.name = name;
}
// @Override
// public void update() {
// // TODO Auto-generated method stub
System.out.println("UseObserver更新通知已收到");
// }
@Override
public void getMessage(String msg) {
// TODO Auto-generated method stub
this.message = msg;
read();
// System.out.println(msg);
}
public void read() {
System.out.println(name + "收到:" + message);
}
}
具体的被观察者继承了Subject.class
中的notifiy()
方法
public class UseSubject extends Subject{
public void doSomething(String msg) {
super.notifiy(msg);
}
}
使用。分别定义三个观察者对象A、B、C
,并且加入到观察者列表里,由被观察者UseSubject
发送一条消息
public class Test {
public static void main(String[] args) {
//subject
UseSubject subject = new UseSubject();
// UseObserver2 observer2 = new UseObserver2();
//useObserver
UseObserver observerA = new UseObserver("A");
UseObserver observerB = new UseObserver("B");
UseObserver observerC = new UseObserver("C");
subject.add(observerA);
subject.add(observerB);
subject.add(observerC);
subject.doSomething(" Message");
}
}
查看运行结果
看到三个观察者都收到了被观察者发送的这条消息。也就达到了我们观察者模式的目的。此时如果将观察者C从观察者对象列表中移除,再运行
public class Test {
public static void main(String[] args) {
//subject
UseSubject subject = new UseSubject();
// UseObserver2 observer2 = new UseObserver2();
//useObserver
UseObserver observerA = new UseObserver("A");
UseObserver observerB = new UseObserver("B");
UseObserver observerC = new UseObserver("C");
subject.add(observerA);
subject.add(observerB);
subject.add(observerC);
subject.doSomething(" Message");
subject.remove(observerC);
subject.doSomething("NEW message");
}
}
可以看到当移除C之后,再发送新的消息也就收不到了。以上就是观察者模式的一个最简单的应用。
.
.
.
欢迎交流和指正