• 对象行为型


    介绍

    观察者模式实质就是定义对象与依赖(对象)之前的关系(一对多),使得如果当前对象自身发生改变时,就可以自动通知其依赖(对象)让其发生改变
    

    使用场景

    消息队列(跨系统信息交互)
    

    角色

    Subject:抽象主题(被观察者)
    ConcreteSubject:抽象主题的实现(被观察者)
    Observer:观察者接口
    ConcreteObserver:观察者接口实现(观察者)
    

    入门案例:

    UML图解:

    代码:

    [Subject]

    //主题
    public abstract class Subject {
    
        //观察者集合
        private List<Observer> observers = new ArrayList<>();
    
        //添加观察者
        public void attach(Observer observer){
            observers.add(observer);
        }
    
        //移除观察者
        public void detach(Observer observer){
            observers.remove(observer);
        }
    
        //通知观察者
        public void Notify(){
            for (Observer observer : observers) {
                observer.update();
            }
        }
    
    }
    

    [ConcreteSubject]

    //具体的主题
    public class MomSubject extends Subject {
    
        //主题消息
        private String msg;
    
        public String getMsg() {
            return msg;
        }
    
        public void setMsg(String msg) {
            this.msg = msg;
        }
    }
    
    

    [Observer]

    public interface Observer {
        void update();
    }
    
    

    [ConcreteObserver]

    //具体的观察者
    public class Son implements Observer {
    
        //名字
        private String name;
        //观察的主题
        private MomSubject subject;
    
        public Son(String name, MomSubject subject) {
            this.name = name;
            this.subject = subject;
        }
    
        @Override
        public void update() {
            System.out.println(name + "..." + subject.getMsg());
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Subject getSubject() {
            return subject;
        }
    
        public void setSubject(MomSubject subject) {
            this.subject = subject;
        }
    }
    

    测试

    public class Main {
        public static void main(String[] args){
            
            //创建主题
            MomSubject subject = new MomSubject();
    
            //设置观察该主题的观察者
            subject.attach(new Son("小强", subject));
            subject.attach(new Son("小红", subject));
    
            //设置通知信息
            subject.setMsg("吃饭了"); //变动处;做到当主题的msg属性发生改变时,依赖就随之发送变动
    
            //通知观察者更新信息
            subject.Notify();
    
            /**
             * output:
             *  小强...吃饭了
                小红...吃饭了
             */
    
        }
    }
    
    
  • 相关阅读:
    Eclipse中的快捷键
    xml文件头文件生成策略以及导入约束条件
    HTTP协议状态代码和错误状态含义的解释
    水了一个前端面试 记下问的东西
    整理的一些PHP面试题目
    Magic Index 寻找数组中A[i]=i的位置(原题转自微信号待字闺中)
    【经典算法】寻找最长01字串(转自待字闺中)
    PHP中不用第三个变量交换两个变量的值
    已知一个数组a[N]来构造数组b[N]的有趣算法题
    MySQL安装后默认自带数据库的作用
  • 原文地址:https://www.cnblogs.com/tandi19960505/p/8271444.html
Copyright © 2020-2023  润新知