现在的位置: 首页 > 操作系统 > 正文

Java设计模式-观察者模式

2020年02月13日 操作系统 ⁄ 共 2947字 ⁄ 字号 评论关闭

观察者模式中主要有4中角色: 1 抽象主题(Subject)角色:抽象主题角色把所有对观察者对象的引用保存在一个聚集(比如ArrayList对象)中,每个主题都可以有任意数量的观察者,抽象主题里提供接口,增加和删除观察者,通知观察者。 2 具体主题(ConcreteSubject)角色:将有关状态,存入具体的观察者对象,当自己状态发生改变时,通知所有的观察者 3 抽象观察者(Observer)角色:为所有的观察者定义一个更新接口 4 具体观察者(ConcreteObserver)角色:实现抽象观察者所定义的更新接口

上面这样说太抽象,下面举一个简单的例子来说明:

import Java.util.ArrayList;import java.util.List;/* * 抽象主题角色类 */public abstract class Subject { private List<Observer> list = new ArrayList<Observer>(); public void attach(Observer observer){ list.add(observer); System.out.println("Attached an Observer!"); } public void detach(Observer observer){ list.remove(observer); } public void notifyObservers(String state){ for (Observer observer:list){ observer.update(state); } }}

/* * 具体主题角色类 */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.notifyObservers(state); }}

/* * 抽象观察者角色类 */public interface Observer { public void update(String state);}

/* * 具体观察者角色类 */public class ConcreteObserver implements Observer{ private String observerState; @Override public void update(String state) { // TODO Auto-generated method stub observerState = state; System.out.println("状态为:"+observerState); }}

public class MainClient { public static void main(String[] args){ ConcreteSubject subject = new ConcreteSubject(); Observer observer = new ConcreteObserver(); subject.attach(observer); subject.change("new State"); }}

运行结果:

Attached an Observer!主题状态发生改变: new State状态为:new State

代码很简单,这里就不多说了

观察者模式又分推模型和拉模型 推模型:主题对象向观察者推送主题的详细信息,不管观察者需不需要,很明显,刚才的例子就是推模型 拉模型:主题对象在通知观察者的时候,只传递少量信息。如果观察者需要更具体的信息,由观察者主动到主题对象中获取,相当于是观察者从主题对象中拉数据。一般这种模型的实现中,会把主题对象自身通过update()方法传递给观察者,这样在观察者需要获取数据的时候,就可以通过这个引用来获取了

拉模型例子:

import java.util.ArrayList;import java.util.List;/* * 抽象主题角色类 */public abstract class Subject { private List<Observer> list = new ArrayList<Observer>(); public void attach(Observer observer){ list.add(observer); System.out.println("Attached an Observer!"); } public void detach(Observer observer){ list.remove(observer); } public void notifyObservers(){ for (Observer observer:list){ observer.update(this); } }}

/* * 具体主题角色类 */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.notifyObservers(); }}

/* * 抽象观察者角色类 */public interface Observer { public void update(Subject subject);}

/* * 具体观察者角色类 */public class ConcreteObserver implements Observer{ private String observerState; @Override public void update(Subject subject) { // TODO Auto-generated method stub observerState = ((ConcreteSubject)subject).getState(); System.out.println("状态为:"+observerState); }}

public class MainClient { public static void main(String[] args){ ConcreteSubject subject = new ConcreteSubject(); Observer observer = new ConcreteObserver(); subject.attach(observer); subject.change("new State"); }}

运行结果:

Attached an Observer!主题状态发生改变: new State状态为:new State

好了,设计模式-观察者模式就总结到这里,如有问题,欢迎指正,谢谢。

本文永久更新链接地址:http://www.xuebuyuan.com/Linux/2016-11/137255.htm

以上就上有关Java设计模式-观察者模式的全部内容,学步园全面介绍编程技术、操作系统、数据库、web前端技术等内容。

抱歉!评论已关闭.