观察者模式

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

复制代码
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();
    }

韩非子:开始吃饭了...
李斯:观察到韩非子活动,开始向老板汇报了。。。
李斯:报告,秦老板!韩非子有活动了--->韩非子在早餐
韩非子:开始娱乐了...
李斯:观察到韩非子活动,开始向老板汇报了。。。
李斯:报告,秦老板!韩非子有活动了--->韩非子在娱乐
相关推荐
ysyxg2 天前
设计模式-观察者模式
观察者模式
安冬的码畜日常3 天前
【JUnit实战3_27】第十六章:用 JUnit 测试 Spring 应用:通过实战案例深入理解 IoC 原理
spring·观察者模式·设计模式·单元测试·ioc·依赖注入·junit5
czy87874754 天前
C语言实现观察者模式
c语言·观察者模式
Miqiuha13 天前
观察者模式学习
学习·观察者模式
金宗汉21 天前
《宇宙递归拓扑学:基于自指性与拓扑流形的无限逼近模型》
大数据·人工智能·笔记·算法·观察者模式
kyle~22 天前
设计模式---观察者模式
服务器·观察者模式·设计模式
Mr_WangAndy23 天前
C++设计模式_行为型模式_观察者模式Observer(发布-订阅(Publish-Subscribe))
c++·观察者模式·设计模式
o0向阳而生0o1 个月前
107、23种设计模式之观察者模式(16/23)
观察者模式·设计模式
青草地溪水旁1 个月前
设计模式(C++)详解——观察者模式(Observer)(1)
c++·观察者模式·设计模式
星空寻流年1 个月前
设计模式第六章(观察者模式)
网络·观察者模式·设计模式