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

    定义

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主体对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

    观察者模式结果图

    subject:抽象主题,定义了具体添加、删除观察者接口、通知接口。

    concreteSubject:具体主题,具体实现了所有接口,并将所有观察者存放在一个集合中,当主题变化时,通过notify接口通知所有观察者。

    observer:观察者接口,定义了更新状态接口

    concreteObserver:具体观察者,实现了当主题变化后,具体的操作内容。

    优缺点

    优点:解除耦合,让耦合的双方都依赖于抽象,从而使得各自的变换都不会影响另一边的变换。

    缺点:如果一个观察者执行逻辑复杂,则会导致整体比较慢

    简单demo

    背景

    背景为当老板来开会了,员工需要认真记录会议内容,以供自己学习。

    解析

    老板是实际的主题,会影响员工状态

    员工是观察者,当感知到老板来了以后,需要认真记录会议内容

    代码实现

    主题接口:

    public interface Subject
    {
        public void addObserver(Observer obj);
        public void deleteObserver(Observer obj);
        public void notifyObserver();
    }

    观察者接口:

    public interface Observer
    {
        public void update(String info);
    }

    boss具体实现主题:

    import java.util.ArrayList;
    import java.util.List;
    
    public class Boss implements Subject
    {
        private List<Observer> objList = new ArrayList<Observer>();
        @Override
        public void addObserver(Observer obj)
        {
            objList.add(obj);
        }
        
        @Override
        public void deleteObserver(Observer obj)
        {
            objList.remove(obj);
        }
        
        @Override
        public void notifyObserver()
        {
            for(Observer obj : objList)
            {
                obj.update("老板来开会");
            }
        }
        
    }

    员工具体实现观察者:

    public class Employee implements Observer
    {
        private String name;
        
        public Employee(String name)
        {
            this.name = name;
        }
    
        @Override
        public void update(String info)
        {
            System.out.println(info + " " + name + "认真记录会议内容。");
        }
    }

    客户端验证:

    public class TestClient
    {
        public static void main(String[] args)
        {
            Employee e1 = new Employee("蜗牛");
            Employee e2 = new Employee("贝壳");
            
            Subject boss = new Boss();
            boss.addObserver(e1);
            boss.addObserver(e2);
            
            boss.notifyObserver();
        }
    }

    内容如下:

    老板来开会 蜗牛认真记录会议内容。
    老板来开会 贝壳认真记录会议内容。
  • 相关阅读:
    操作系统复习——系统引论
    数据库实验四
    数据库实验三
    数据库实验二
    数据库基本概念
    2018年的总结和2019年的期望
    [kuangbin带你飞]专题七 线段树
    小程序之Button组件,函数的调用与简单的逻辑
    小程序之如何设置图片以及image组件的属性
    php 函数
  • 原文地址:https://www.cnblogs.com/woniu4/p/8393148.html
Copyright © 2011-2022 走看看