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

定义

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

角色

目标角色(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查看:点击此处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值