设计模式-行为型-观察者模式(Observer)

来源:互联网 发布:java 数据库连接池 编辑:程序博客网 时间:2024/05/29 07:16

定义

定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新

角色

目标角色(Subject):提供添加和删除观察者对象的接口,可以有一个或多个观察者

具体目标角色:具体目标角色的状态发生变化时,通知它的观察者

观察者角色(Observer):为具体观察者提供一个统一接口

具体观察者角色:在目标发生改变时获得通知,并做出相应处理

优点

  • 观察者和目标的关联关系不紧密,耦合度低,容易扩展
  • 目标变化时,可向所有观察者发出通知,可用于广播通讯

缺点

  • 如果观察者较多,通知观察者花费的时间较长
  • 观察者模式用的是触发链的结构,比较容易出现循环引用的错误

应用场景

  • AWT中的事件处理机制

类图

观察者模式

package com.vapy.behavior.Observe;import java.util.Vector;/** *  * @author vapy * */public abstract class Subject {    private Vector<Observer> obs = new Vector<Observer>();    public void addObserver(Observer observer) {        this.obs.add(observer);    }    public void delObserver(Observer observer) {        this.obs.remove(observer);    }    protected void notifyObservers() {        for(Observer o : obs) {            o.update();        }    }    public abstract void click();}
package com.vapy.behavior.Observe;/** *  * @author vapy * */public class Mouse extends Subject {    @Override    public void click() {        System.out.println("i am a mouse, click");        this.notifyObservers();    }}
package com.vapy.behavior.Observe;/** *  * @author vapy * */public interface Observer {    public void update();}
package com.vapy.behavior.Observe;/** *  * @author vapy * */public class MouseListener1 implements Observer {    @Override    public void update() {        System.out.println("i am a mouse listener 1, i receive the mouse click");    }}
package com.vapy.behavior.Observe;/** *  * @author vapy * */public class MouseListener2 implements Observer {    @Override    public void update() {        System.out.println("i am a mouse listener 2, i receive the mouse click");    }}
package com.vapy.behavior.Observe;/** *  * @author vapy *  * 观察者模式 * */public class Client {    public static void main(String[] args) {        Subject sub = new Mouse();        sub.addObserver(new MouseListener1());        sub.addObserver(new MouseListener2());        sub.click();    }}

观察者模式结果
本文代码可在github查看:点击此处

6 0