观察者模式

李斯和韩非子都是荀子的学生,李斯是师兄,韩非子是师弟,若干年后,李斯成为秦国的上尉,致力于统一全国,于是安插了间谍到各个国家的重要人物的身边进行监视,韩非子身边也有很多间谍,韩非子早饭吃的什么,晚上在做什么娱乐,李斯都了如指掌,我们先通过程序把这个过程展现一下,看看李斯是怎么监控韩非子的,先看类图:

public class HanFeiZi implements IHanFeiZi{
    private boolean isHavingBreakfast = false;
    private boolean isHavingFun = false;
    @Override
    public void haveBreakfast() {
        System.out.println("韩非子:开始吃饭了...");
        this.isHavingBreakfast = true;
    }
    public void haveFun(){
        System.out.println("韩非子:开始娱乐了...");
        this.isHavingFun = true;
    }

    public boolean isHavingBreakfast() {
        return isHavingBreakfast;
    }

    public void setHavingBreakfast(boolean ishavingBreakfast) {
        this.isHavingBreakfast = ishavingBreakfast;
    }

    public boolean isHavingFun() {
        return isHavingFun;
    }

    public void setHavingFun(boolean ishavingFun) {
        this.isHavingFun = ishavingFun;
    }
}

public interface IHanFeiZi {
    public void haveBreakfast();
    public void haveFun();
}

public interface ILiSi {
    //一发现别人有动静,自己也要行动起来
    public void update(String context);
}

public class LiSi implements ILiSi{
    @Override
    public void update(String context) {
        System.out.println("李斯:观察到韩非子活动,开始向老板汇报了。。。");
        this.reportToQinShiHuang(context);
    }
    private void reportToQinShiHuang(String reportContext){
        System.out.println("李斯:报告,秦老板!韩非子有活动了--->"+reportContext);
    }
}

public class Watch extends Thread{
    private HanFeiZi hanFeizi;
    private LiSi liSi;
    private String type;
    public Watch(HanFeiZi hanFeiZi,LiSi liSi,String type){
        this.hanFeizi = hanFeiZi;
        this.liSi = liSi;
        this.type = type;
    }
    @Override
    public void run(){
        while(true){
            try{
                Thread.sleep(10);
            } catch (InterruptedException e){
                e.printStackTrace();
            }
            //监控是否在吃早餐
            if( "breakfast".equals(type)){
                //如果发现韩非子在吃饭,就通知李斯
                if(hanFeizi.isHavingBreakfast()) {
                    liSi.update("韩非子在早餐");
                    hanFeizi.setHavingBreakfast(false);
                }
            }else {
                if(this.hanFeizi.isHavingFun()){
                    liSi.update("韩非子在娱乐");
                    hanFeizi.setHavingFun(false);
                }
            }
        }
    }
}

public static void main(String[] args) {
        LiSi liSi = new LiSi();
        HanFeiZi hanFeizi = new HanFeiZi();
        //观察早餐
        Watch watchBreakfast = new Watch(hanFeizi,liSi,"breakfast");
        watchBreakfast.start();
        Watch watchFun = new Watch(hanFeizi,liSi,"fun");
        watchFun.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        hanFeizi.haveBreakfast();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        hanFeizi.haveFun();
    }

韩非子:开始吃饭了...
李斯:观察到韩非子活动,开始向老板汇报了。。。
李斯:报告,秦老板!韩非子有活动了--->韩非子在早餐
韩非子:开始娱乐了...
李斯:观察到韩非子活动,开始向老板汇报了。。。
李斯:报告,秦老板!韩非子有活动了--->韩非子在娱乐
相关推荐
汤兰月7 小时前
Python中的观察者模式:从基础到实战
开发语言·python·观察者模式
神的孩子都在歌唱3 天前
行为设计模式 -观察者模式- JAVA
java·观察者模式·设计模式
It'sMyGo5 天前
js设计模式-工厂模式 单例模式 观察者模式 发布订阅模式 原型模式 代理模式 迭代器模式
观察者模式·单例模式·设计模式
java_heartLake10 天前
设计模式之观察者模式
java·观察者模式·设计模式
林小果110 天前
观察者模式
java·开发语言·观察者模式·设计模式
shanshan209910 天前
观察者模式在C#实际应用中的使用:PLC数据监控
观察者模式
潘多编程10 天前
Spring Boot 实战:使用观察者模式实现实时库存管理
spring boot·后端·观察者模式
学步_技术12 天前
Python编码系列—Python观察者模式:实现事件驱动架构的利器
python·观察者模式·架构
赤橙红的黄12 天前
观察者模式(发布-订阅模式)
java·开发语言·观察者模式
仙魁XAN13 天前
Unity 设计模式 之 行为型模式 -【状态模式】【观察者模式】【备忘录模式】
观察者模式·unity·设计模式·状态模式·备忘录模式