设计模式GOF23——观察者模式

观察者模式(Observer),是一种行为性模型,行为型模式关注的是系统中对象之间的相互交互,解决系统在运行时对象之间的相互通信和协作,进一步明确对象的职责。相比来说,创建型模式关注对象的创建过程,结构型模式关注对象和类的组合关系。

模式的职责

观察者模式主要用于1对N的通知。当一个对象的状态变化时,他需要及时告知一系列对象,令他们做出相应。
实现有两种方式:
推:每次都会把通知以广播的方式发送给所有观察者,所有的观察者只能被动接收。
拉:观察者只要知道有情况即可,至于什么时候获取内容,获取什么内容,都可以自主决定。

模式的实现

//观察者的接口,用来存放观察者的共有方法
public interface Observer {
    //观察者方法,改变观察对象时的通知
    void uppdate(Subject s);
}
//具体观察者的实现
class PushObserver implements Observer{
    private int x;

    public void uppdate(Subject s) {
        //具体观察者实现的对通知的方法
        //推的方式,让值直接改变
        this.x = ((RealSubject)s).getX();
    }
    //取得值,如果没有就是默认值,但是要注意默认值必须没有意义,而且调用的时候需要
    public int getX() {
        return this.x;
    }

}
class PopObserver implements Observer{
    private int x = 0;
    private Subject s = null;
    public void uppdate(Subject s) {
        //具体观察者实现的对通知的方法
        //拉的方式,先保存下来,需要了再拉
        this.s = s;
    }
    //取得更新的值,如果没有就是默认值,但是要注意默认值必须没有意义,而且调用的时候需要注意
    public int getX(){
        if(null != s){
            this.x = ((RealSubject)s).getX();
        }
        return x;
    }

}
//观察对象的父类,定义观察对象锁需要的公共变量和方法
public class Subject {
    //观察者的存储集合,因为观察者一般很多
    List<Observer>list = new ArrayList<Observer>();
    //观察者的注册方法,用来注册成为观察者
    public void registerObserver(Observer observer){
        list.add(observer);
    }
    //观察者的删除方法,用来取消对特定对象的观察
    public void removeObserver(Observer observer){
        list.remove(observer);
    }
    //观察者模式的核心方法,通知每个观察值对象一定的观察的对象的改变
    public void notifyAllObserver(){
        for(Observer o:list){
            o.uppdate(this); 
        }
    }
}
//具体观察对象的实现
class RealSubject extends Subject{
    //被观察对象的属性,可以是任何值,也可以是任何对象,也可以是很多值或者对象
    private int x;

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
        //被观察对象值发生变化的时候通知所有的观察者
        this.notifyAllObserver();
    }

}
//客户端调用
public class Client {

    public static void main(String[] args) {
        //创建被观察对象
        RealSubject rs = new RealSubject();
        //创建观察者对象
        PushObserver po = new PushObserver();
        PopObserver oo = new PopObserver();
        //观察者对象注册开始观察
        rs.registerObserver(oo);
        rs.registerObserver(po);
        //被观察者对象改变
        //设置一个值观察者就会跟着改变
        rs.setX(100);
        System.out.println(po.getX());
        System.out.println(oo.getX());
        System.out.println("**********为了区分开");
        //设置一个值观察者就会跟着改变
        rs.setX(200);
        System.out.println(po.getX());
        System.out.println(oo.getX());

    }

}

输出结果是
100
100
****为了区分开
200
200

JAVASE中提供的类包装

java.util.Observable和java.util.Observer来实现观察者模式
这个时候就不用创建Observer的抽象了,直接使用Java包中是就可以了。目标对象已经修改使用setChanged()方法,通知所有的观察者用notifyObservers(变量值)方法,实现Observer还需要实现update(Observerable o,Objsct g)方法,其中Object g可以接收任何需要观察的对象。

模式的应用

在很多软件中都有一些需要共享的东西,比如游戏时每个玩家的操作,聊天时聊天的信息等等,这个时候就可以使用观察者模式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值