• 观察者模式【java版】


    一、定义观察者类

     1)观察者DiningObserver

    public class DiningObserver implements Observer {

    //只需要实现Observer接口中的update方法
    public void update(Observable o, Object arg) {
    if(arg.equals("Dining") ){
    System.out.println("我是观察者DiningObserver,当前被观察者的状态为:Dining!");
    }else{
    System.out.println("我是观察者DiningObserver,但状态不匹配");
    }
    }
    }

     2)观察者SleepingObserver

    public class SleepingObserver implements Observer {

    //只需要实现Observer接口中的update方法
    public void update(Observable o, Object arg) {
    if(arg.equals("Sleeping") ){
    System.out.println("我是观察者SleepingObserver,当前被观察者的状态为:Sleeping!");
    }else{
    System.out.println("我是观察者SleepingObserver,但状态不匹配");
    }
    }
    }

     3)观察者WorkingObserver

    public class WorkingObserver implements Observer {

    //只需要实现Observer接口中的update方法
    public void update(Observable o, Object arg) {
    if(arg.equals("Working") ){
    System.out.println("我是观察者WorkingObserver,当前被观察者的状态为:Working!");
    }else{
    System.out.println("我是观察者WorkingObserver,但状态不匹配");
    }
    }
    }

    二、定义被观察者类

    public class ConcreteObserved extends Observable {

    public ConcreteObserved(String state) {
    this.state=state;
    }

    /*
    * 使用者基本只需要自己定义一个方法,决定在什么情况下通知所有观察者
    * 在自定义的这个方法里,都是直接调用父类的方法
    */
    public void modifyState(String state){
    this.state=state;
    setChanged();//一定要设置改变位
    notifyObservers(this.state);//将参数通知到每个观察者
    //通知完之后会自动调用clearChanged方法
    }

    private String state;
    }

    三、测试

    public class Main {

    public static void main(String[] args) {

    System.out.println("开始测试观察者模式。。。");

    //创建三个观察者
    DiningObserver theDiningObserver=new DiningObserver();
    SleepingObserver theSleepingObserver=new SleepingObserver();
    WorkingObserver theWorkingObserver=new WorkingObserver();

    //创建一个被观察者
    ConcreteObserved theConcreteObserved=new ConcreteObserved(new String("NoState"));

    //将三个观察者都添加到被观察者的观察者列表中
    theConcreteObserved.addObserver(theDiningObserver);
    theConcreteObserved.addObserver(theSleepingObserver);
    theConcreteObserved.addObserver(theWorkingObserver);

    //被观察者状态发生改变
    theConcreteObserved.modifyState(new String("Dining"));
    }

    }

     运行结果:



  • 相关阅读:
    C# 类型的创建
    C# 中4个访问符和8个修饰符详解
    C#命名空间详解namespace
    ContextMenuStrip 添加在窗体。点击右键不能显示问题解答
    C# 学习笔记 C#基础
    React-Navigation web前端架构
    Css animation 与 float 、flex 布局问题
    javaScript 工作必知(十一) 数组常用方法实现
    Vue 父子组件传值 props
    kafka 参数配置 1
  • 原文地址:https://www.cnblogs.com/edisonfeng/p/2289096.html
Copyright © 2020-2023  润新知