• 【设计模式】观察者模式


    观察者模式

    1.什么是观察者模式

    • 先讲什么是行为性模型,行为型模式关注的是系统中对象之间的相互交互,解决系统在运行时对象之间的相互通信和协作,进一步明确对象的职责。

    • 观察者模式,是一种行为性模型,又叫发布-订阅模式,他定义对象之间一种一对多的依赖关系,使得当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。

    2.模式的职责

    • 观察者模式主要用于1对N的通知。当一个对象的状态变化时,他需要及时告知一系列对象,令他们做出相应。
      实现有两种方式:
    1. 推:每次都会把通知以广播的方式发送给所有观察者,所有的观察者只能被动接收。
    2. 拉:观察者只要知道有情况即可,至于什么时候获取内容,获取什么内容,都可以自主决定。

    3.观察者模式应用场景

    • 关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系。事件多级触发场景。
    • 跨系统的消息交换场景,如消息队列、事件总线的处理机制。

    4.代码实现观察者模式

    1. 定义抽象观察者,每一个实现该接口的实现类都是具体观察者。

    package com.lijie;
    
    //观察者的接口,用来存放观察者共有方法
    public interface Observer {
        // 观察者方法
        void update(int state);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.定义具体观察者

    package com.lijie;
    
    // 具体观察者
    public class ObserverImpl implements Observer {
    
        // 具体观察者的属性
        private int myState;
    
        public void update(int state) {
            myState=state;
            System.out.println("收到消息,myState值改为:"+state);
        }
    
        public int getMyState() {
            return myState;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3.定义主题。主题定义观察者数组,并实现增、删及通知操作。

    package com.lijie;
    
    import java.util.Vector;
    
    //定义主题,以及定义观察者数组,并实现增、删及通知操作。
    public class Subjecct {
    	//观察者的存储集合,不推荐ArrayList,线程不安全,
    	private Vector<Observer> list = new Vector<>();
    
    	// 注册观察者方法
    	public void registerObserver(Observer obs) {
    		list.add(obs);
    	}
        // 删除观察者方法
    	public void removeObserver(Observer obs) {
    		list.remove(obs);
    	}
    
    	// 通知所有的观察者更新
    	public void notifyAllObserver(int state) {
    		for (Observer observer : list) {
    			observer.update(state);
    		}
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    4.定义具体的,他继承继承Subject类,在这里实现具体业务,在具体项目中,该类会有很多。

    package com.lijie;
    
    //具体主题
    public class RealObserver extends Subjecct {
        //被观察对象的属性
    	 private int state;
    	 public int getState(){
    		 return state;
    	 }
    	 public void  setState(int state){
    		 this.state=state;
    		 //主题对象(目标对象)值发生改变
    		 this.notifyAllObserver(state);
    	 }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    5.运行测试

    package com.lijie;
    
    public class Client {
    
    	public static void main(String[] args) {
    		// 目标对象
    		RealObserver subject = new RealObserver();
    		// 创建多个观察者
    		ObserverImpl obs1 = new ObserverImpl();
    		ObserverImpl obs2 = new ObserverImpl();
    		ObserverImpl obs3 = new ObserverImpl();
    		// 注册到观察队列中
    		subject.registerObserver(obs1);
    		subject.registerObserver(obs2);
    		subject.registerObserver(obs3);
    		// 改变State状态
    		subject.setState(300);
    		System.out.println("obs1观察者的MyState状态值为:"+obs1.getMyState());
    		System.out.println("obs2观察者的MyState状态值为:"+obs2.getMyState());
    		System.out.println("obs3观察者的MyState状态值为:"+obs3.getMyState());
    		// 改变State状态
    		subject.setState(400);
    		System.out.println("obs1观察者的MyState状态值为:"+obs1.getMyState());
    		System.out.println("obs2观察者的MyState状态值为:"+obs2.getMyState());
    		System.out.println("obs3观察者的MyState状态值为:"+obs3.getMyState());
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
  • 相关阅读:
    Dynamics 365 QueryExpression生成工具
    368. 最大整除子集
    神经网络模型的参数量和计算量
    Qt 中设置窗体(QWidget)透明度的几种方法
    题目0149-优选核酸检测点
    ROS2进阶第三章 -- 机器人语音交互之ros集成科大讯飞中文语音库,实现语音控制机器人小车
    函数类型和函数指针
    人工智能——图像处理和Python深度学习的全教程(建议收藏)
    无线传感器网络:物理层设计
    Python Opencv实践 - Harris角点检测
  • 原文地址:https://blog.csdn.net/df007df/article/details/133993534