今天在写一个功能的时候,因为是自己扩展的缘故,所以要实现监听器的功能,于是乎,,,,,,
什么是观察者模式
观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
下面是类图
我的感觉就是抽象主题中有个集合来存储抽象观察者, 抽象主题中可以添加和删除抽象观察者, 具体主题继承抽象主题,具体观察者继承抽象观察者,然后发生时间后执行 Notify方法。下面上代码
抽象主题:
public abstract class Subject {
private ArrayList<Observer> observers=new ArrayList<Observer>();
/**
* 增加观察者
* */
public void Attach(Observer observer){
observers.add(observer);
}
/**
* 移除观察者
* */
public void Detach(Observer observer){
observers.remove(observer);
}
/**
* 向观察者们发出通知
* */
public void Notify(){
for (Observer ob :observers) {
ob.Update();
}
}
}
/**
*抽象观察者类,为所有具体观察者定义一个接口,在得到通知时更新自己
* **/
public abstract class Observer {
public abstract void Update();
}
具体主题:
public class ConcreteSubject extends Subject{
private String subjectState;
public String getSubjectState() {
return subjectState;
}
public void setSubjectState(String subjectState) {
this.subjectState = subjectState;
Notify();
}
}
具体观察者:
public class ConcreteObserver extends Observer {
private String observerState;
private String name;
private ConcreteSubject subject;
public ConcreteObserver(ConcreteSubject subject,String name) {
// TODO Auto-generated constructor stub
this.subject=subject;
this.name=name;
}
public String getObserverState() {
return observerState;
}
public void setObserverState(String observerState) {
this.observerState = observerState;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ConcreteSubject getSubject() {
return subject;
}
public void setSubject(ConcreteSubject subject) {
this.subject = subject;
}
@Override
public void Update() {
// TODO Auto-generated method stub
observerState = subject.getSubjectState();
System.out.println("The observer's state of"+name+"is "+observerState);
}
}
main方法
public class Program {
public static void main(String[] args) {
// 具体主题角色通常用具体自来来实现
ConcreteSubject subject = new ConcreteSubject();
subject.Attach(new ConcreteObserver(subject, "Observer A"));
subject.Attach(new ConcreteObserver(subject, "Observer B"));
subject.Attach(new ConcreteObserver(subject, "Observer C"));
subject.setSubjectState("Ready") ;
}
}
执行之后
The observer's state of Observer A is Ready
The observer's state of Observer B is Ready
The observer's state of Observer C is Ready