zoukankan      html  css  js  c++  java
  • 设计模式之观察者模式

    1.观察者模式

      观察者这模式定义了对象之间一对多依赖,这样一来,当一个对象的改变时,它的所有依赖者都会受到通知并自动更新。

    2.举个例子:小明快要高考了,小明的妈妈和爸爸监控着家里的电脑,一旦有人使用就会收到通知。这时小明的爸爸妈妈就为观察者(Observer),而电脑是否被使用就是一个主题(Subject)。小明的爸爸妈妈的信息需要注册到电脑中,当电脑被使用是他们才能收到通知。

    (1).首先定义一个主题接口(定义了一些必要的方法)

    //主题接口类
    public interface Subject {
        void registerObserver(Observer observer); //将观察者注册到主题类中
        void removeObserver(Observer observer);   //移除观察者
        void notifyObservers();                   //通知所有的观察者
    }

    (2).定义一个电脑的状态的主题

    public class ComputerState implements Subject {
        private ArrayList<Observer> observerArrayList = new ArrayList<>();   //保存了所有的观察者
    
        @Override
        public void registerObserver(Observer observer) {
            observerArrayList.add(observer);                  //将观察者注册到主题中
        }  
    
        @Override
        public void removeObserver(Observer observer) {            //移除观察者
            observerArrayList.remove(observer);
        }
    
        @Override
        public void notifyObservers() {                      //通知所有的观察者
            for (Observer o :
                    observerArrayList) {
                o.update("有人在玩儿电脑了。。。");
            }
        }
    
        public void someOneUserComputer() {                  //电脑被人操作了
            notifyObservers();
        }
    }

    在此例中,注册方法表示这个观察者(小明的爸爸,妈妈,当然如果他的七大姑,八大姨如果想知道也可以进行注册。。。。)想要知道小明是否在玩电脑。

    (3)定义观察者接口

    //观察者接口类
    public interface Observer {
        void update(String string); //用来通知观察者的方法,这里是发送一个信息(字符串)
    }

    (4)具体的观察者

    public class XiaoMingFather implements Observer {   //小明的爸爸
        private Subject subject;
    
        public XiaoMingFather(Subject subject) {
            this.subject = subject;
            subject.registerObserver(this);      //将自己的信息注册到主题中
        }
    
        @Override
        public void update(String string) {
            System.out.println("小明爸爸知道" + string); 
        }
    }
    public class XiaoMingMother implements Observer {  //小明的妈妈
        private Subject subject;
    
        public XiaoMingMother(Subject subject) {
            this.subject = subject;
            subject.registerObserver(this);
        }
    
        @Override
        public void update(String string) {
            System.out.println("小明妈妈知道" + string);
    
        }
    }

    (5)这是小明。。。(作为测试)

    public class XiaoMing {
        ComputerState computerState;
    
        public XiaoMing(ComputerState computerState) {
            this.computerState = computerState;
        }
    
        public void playGame(){
            computerState.someOneUserComputer();
        }
    }

    3.最后做个测试

    public class Test {
        public static void main(String[] args) {
            ComputerState computerState = new ComputerState();        //这是一个电脑
            XiaoMingMother mother = new XiaoMingMother(computerState); //小明妈妈
            XiaoMingFather father = new XiaoMingFather(computerState); //小明爸爸
            XiaoMing xiaoMing = new XiaoMing(computerState);          //小明
            xiaoMing.playGame();                      //小明在作死。。。。。
        }
    }

    运行结果

    最后。。。小明可能会比较惨

     

    相关的代码放在 https://github.com/LiWangCai/blogRelated 上面,可自行获取

  • 相关阅读:
    spring boot中 使用http请求
    spring boot 多层级mapper
    spring boot 使用拦截器,注解 实现 权限过滤
    spring boot 集成mybatis报错
    spring boot 使用拦截器 实现 用户登录拦截
    mac eclipse 删除不用的workspace
    maven+eclipse+mac+tomcat 多模块发布
    启动spring boot 异常
    安装 redis [standlone模式]
    quartz项目中的运用
  • 原文地址:https://www.cnblogs.com/liwangcai/p/10742946.html
Copyright © 2011-2022 走看看