程序设计模式是人们在程序设计的漫长历程中逐渐总结出来的应用在某一实际应用场景下的相对固定的一种程序设计方式;设计模式不局限与某一种语言,可以在多种语言程序设计中应用,在程序架构设计中运用合适的设计模式对程序的健壮性,可扩展性具有至关重要的作用;
在面向对象的程序语言设计中,当程序中的某一对象的状态发生变化时,其他依附于此对象状态的对象需要根据其状态变化修改自身状态或发生某些动作,如何进行设计可以底耦合、高效率的完成上述要求就需要应用到我们下面讲到的设计模式----观察这模式。
观察者模式分为2中角色一个称之为观察者,另一个称为主体,为了更加通用的实现观察者模式还需要另外2个角色:抽象观察者和抽象主体
抽象主体:一个抽象类,提供将多个观察者绑定到主体对象、通知观察者等方法。
主体:状态主动变化对象,为实现观察模式需要集成抽象主体类。
抽象观察者:一个接口,定义了主体对象通知观察者的方法。
观察者:具体的观察者对象,实现抽象观察者接口,用于具体响应主体的通知。
图示关系:
抽象主体实现代码如下:
public abstract class Subject {
/*** 用来保存注册的观察者对象*/
private List<Observer> list = new ArrayList<Observer>();
/**
* 注册观察者对象
* @param observer 观察者对象
*/
public void attach(Observer observer){
list.add(observer);
System.out.println("Attached an observer");
}
/**
* 删除观察者对象
* @param observer 观察者对象
*/
public void detach(Observer observer){
list.remove(observer);
}
/**
* 通知所有注册的观察者对象
*/
public void nodifyObservers(String newState){
for(Observer observer : list){
observer.update(newState);
}
}
}
通过观察代码,看到在抽象主体定义一个List 保存所有的观察者对象,并提供增加、删除、通知观察者的方法;通过调用观察者的update方法并传递参数进行相关状态的修改。
主体:实现代码:
public class ConcreteSubject extends Subject{
private String state;
public String getState() {
return state;
}
public void change(String newState){
state = newState;
System.out.println("主题状态为:" + state);
//状态发生改变,通知各个观察者
this.nodifyObservers(state);
}
}
抽象观察者:
public interface Observer {
/**
* 更新接口
* @param state 更新的状态
*/
public void update(String state);
}
观察者:
public class ConcreteObserver implements Observer {
//观察者的状态
private String observerState;
@Override
public void update(String state) {
/**
* 更新观察者的状态,使其与目标的状态保持一致
*/
observerState = state;
System.out.println("状态为:"+observerState);
}
}
测试代码:
public class Client {
public static void main(String[] args) {
//创建主题对象
ConcreteSubject subject = new ConcreteSubject();
//创建观察者对象
Observer observer = new ConcreteObserver();
//将观察者对象登记到主题对象上
subject.attach(observer);
//改变主题对象的状态
subject.change("new state");
}
}
通过以上代码可以得到以下结论
1、观察者对象和主体对象时多对一的关系,一个主体可以绑定多个观察者
2、通知方法对象可进行自定义,通知对象时可根据需求定义多种传递参数类型。
JAVA语言中观察者模式的实现方式
JAVA语言中已提供了一个抽象类(Observable)作为抽象主体,一个接口(Observer)作为抽象观察者来具体实现观察者模式。