观察者模式

定义:定义对象间一种一对多的依赖关系,是的每当一个对象改变状态,则所有依赖于他的对象都会得到通知并被自动更新.
这里写图片描述

我们先来解释一下观察者模式的几个角色名称:

  • Subject被观察者:定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。它一般是抽象类或者是实现类,仅仅完成作为被观察这必须实现的职责:管理观察者并通知观察者。
  • Observer观察者:观察者接收到消息后,机进行update(更新方法)操作,对接收到的信息进行处理。
  • ConcreteSubject具体的被观察者:定义被观察者自己的业务逻辑,同时定义对哪些事情进行通知。
  • ConcreteObserver具体的观察者:每个观察在接收到消息后的处理反应是不同,各个观察者有自己的处理逻辑。

由于Java给我们已经封装好了Observer和Observable.所以我们的代码就很简略了,下面上通用代码.
1.HanFeiZi.java 定义被观察者

public class HanFeiZi extends Observable{

    //韩非子要吃饭了
    public void haveBreakfast(){
        System.out.println("韩非子:开始吃饭了...");
        //通知所有的观察者
        super.setChanged();
        super.notifyObservers("韩非子在吃饭");

    }

    //韩非子开始娱乐了,古代人没啥娱乐,你能想到的就那么多
    public void haveFun(){
        System.out.println("韩非子:开始娱乐了...");
        super.setChanged();
        this.notifyObservers("韩非子在娱乐");
    }

}

2.定义观察者

public class LiSi implements Observer{

    //首先李斯是个观察者,一旦韩非子有活动,他就知道,他就要向老板汇报
    public void update(Observable observable,Object obj){
        System.out.println("李斯:观察到李斯活动,开始向老板汇报了...");
        this.reportToQiShiHuang(obj.toString());
        System.out.println("李斯:汇报完毕,秦老板赏给他两个萝卜吃吃...\n");
        try {
            System.out.println("我开始休眠 " + System.currentTimeMillis());
            Thread.sleep(3000);
            System.out.println("我起来了 " + System.currentTimeMillis());

        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    //汇报给秦始皇
    private void reportToQiShiHuang(String reportContext){
        System.out.println("李斯:报告,秦老板!韩非子有活动了--->"+reportContext);
    }
}


public class LiuSi implements Observer{

    //刘斯,观察到韩非子活动后,自己也做一定得事情
    public void update(Observable observable,Object obj){
        System.out.println("刘斯:观察到韩非子活动,开始动作了...");
        this.happy(obj.toString());
        System.out.println("刘斯:真被乐死了\n");
    }

    //一看韩非子有变化,他就快乐
    private void happy(String context){
        System.out.println("刘斯:因为" +context+",——所以我快乐呀!" );
    }
}


public class WangSi implements Observer{

    //王斯,看到李斯有活动,自己就受不了
    public void update(Observable observable,Object obj){
        System.out.println("王斯:观察到韩非子活动,自己也开始活动了...");
        this.cry(obj.toString());
        System.out.println("王斯:真真的哭死了...\n");
    }

    //一看李斯有活动,就哭,痛哭
    private void cry(String context){
        System.out.println("王斯:因为"+context+",——所以我悲伤呀!");
    }
}

3.场景类

public class Client {

    public static void main(String[] args) {
        //三个观察者产生出来
        Observer liSi = new LiSi();
        Observer wangSi = new WangSi();
        Observer liuSi = new LiuSi();

        //定义出韩非子
        HanFeiZi hanFeiZi = new HanFeiZi();

        //我们后人根据历史,描述这个场景,有三个人在观察韩非子

        hanFeiZi.addObserver(wangSi);
        hanFeiZi.addObserver(liuSi);
        hanFeiZi.addObserver(liSi);

        //然后这里我们看看韩非子在干什么
        hanFeiZi.haveBreakfast();       
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值