java-设计模式-观察者模式 java自带

观察者模式-发布订阅模式
一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象
当主题对象发送变化时会通知所有观察者
观察者自动更新自己

java本身有自带观察者模式实现
java.util.Observable 被观察者
    setChanged();//数据改变
    notifyObservers();//发起通知,这个需要与setChanged()一起使用,使用这个 观察者会自动调用 update方法
    notifyObservers(Object arg);//发送通知,并且传数据给观察者
java.util.Observer 观察者
    重写 update(Observable o, Object arg) 方法,Observable o为 被观察者对象,arg对应 notifyObservers(Object arg)的arg;
        当被观察者发起 notifyObservers 通知时,观察者会自动调用此update方法

用观察者模式实现 员工观察老板发命令的例子:

老板类(被观察者类):

/**
 * 老板类 被观察者
 */
public class Boss extends Observable {
    private String cmd;
    public void sendCmd(String cmd){
        System.out.println("老板发命令了 "+cmd);
        this.cmd =cmd;
        setChanged();//改变 一定要先调用 setChanged
//        notifyObservers();//调用
        String data = "老板发出的命令";
        notifyObservers(data);
    }



    //getter and setter

    public String getCmd() {
        return cmd;
    }

    public void setCmd(String cmd) {
        this.cmd = cmd;
    }
}

员工类(观察者类):


/**
 * 员工类,观察者
 */
public class Staff implements Observer {
    private String name;
    public Staff(Boss boss,String name){//得到被观察者的所有
        boss.addObserver(this);//观察老板的一举一动
        this.name = name;
    }
    @Override
    public void update(Observable o, Object arg) {
        Boss boss = (Boss) o;
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("老板有新命令"+" 员工"+name+" 准备行动 "+boss.getCmd() +" 线程:"+Thread.currentThread() + " "+ arg);
    }
}

main方法:

    public static void main(String[] args) {
        System.out.println("主函数,可以在任意类");
        Boss boss = new Boss();
        Staff staff1 = new Staff(boss,"小赵");
        Staff staff2 = new Staff(boss,"小黄");
        Staff staff3 = new Staff(boss,"小刘");
        //老板发命令了
        boss.sendCmd("休息");
        boss.sendCmd("工作");

    }

运行结果:

主函数,可以在任意类
老板发命令了 休息
老板有新命令 员工小刘 准备行动 休息 线程:Thread[main,5,main] 老板发出的命令
老板有新命令 员工小黄 准备行动 休息 线程:Thread[main,5,main] 老板发出的命令
老板有新命令 员工小赵 准备行动 休息 线程:Thread[main,5,main] 老板发出的命令
老板发命令了 工作
老板有新命令 员工小刘 准备行动 工作 线程:Thread[main,5,main] 老板发出的命令
老板有新命令 员工小黄 准备行动 工作 线程:Thread[main,5,main] 老板发出的命令
老板有新命令 员工小赵 准备行动 工作 线程:Thread[main,5,main] 老板发出的命令

说明观察者响应都是同步进行响应的,一个一个进行响应的。

发布了60 篇原创文章 · 获赞 6 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/xiaoluo5238/article/details/104493072