• 3 行为型模式之


    观察者模式介绍: 

    观察者模式是一个使用率非常高的模式,这最深用的地方是GUI系统,订阅--发布系统。因为这个模式一个重要作用就是解耦,将被观察者和观察者解耦,使得他们之间的依赖性更小。

    定义:定义对象间一种一对多的关系,使得每当一个对象改变状态,则所有依赖它的对象都会得到通知并被自动更新

    使用场景:

    1 关联行为场景。需要注意的是,关联行为是可拆分的,而不是“组合”的关系

    2 事件多级触发场景

    3 跨系统的消息交换场景,如消息队列,事件总线的处理机制

    下面我们以生活中的交通灯:以行人过马路说起为例,其中车和行人是观察者,红灯是被观察者,以人的视角为例

    观察者:车和行人

    被观察者:红灯

    红灯亮了(车对面的绿灯也亮了),车行,行人停

    代码如下:

    1 /**
    2  * 观察者
    3  */
    4 public abstract class Observer {
    5     protected abstract void onChange();
    6 }
    1 /**
    2  * 观察者:车
    3  */
    4 public class Car extends Observer{
    5     @Override
    6     protected void onChange() {
    7         System.out.println("绿灯亮了,我可以走了");
    8     }
    9 }
    1 /**
    2  * 观察者:行人
    3  */
    4 public class People extends Observer{
    5     @Override
    6     protected void onChange() {
    7         System.out.println("红灯亮了,我要等一等");
    8     }
    9 }

    下面是被观察者:灯

     1 /**
     2  * 被观察者:灯
     3  */
     4 public class Observable {
     5     //观察者集合
     6     private ArrayList<Observer> observers = new ArrayList<>();
     7 
     8     //注册一个观察者
     9     public void registerObserver(Observer observer){
    10         observers.add(observer);
    11     }
    12 
    13     //反注册一个观察者
    14     public void unregisterObserver(Observer observer){
    15         observers.remove(observer);
    16     }
    17 
    18     public void dataChanged(){
    19         for (Observer observer : observers){
    20             observer.onChange();
    21         }
    22     }
    23 
    24 }

    下面是测试类

     1 /**
     2  * 测试观察者模式
     3  */
     4 public class ObserverTest {
     5 
     6     public static void main(String[] args){
     7 
     8         //创建两个观察者
     9         Observer car = new Car();
    10         Observer people = new People();
    11 
    12         //创建一个被观察者
    13         Observable observable = new Observable();
    14 
    15         //注册两个观察者
    16         observable.registerObserver(car);
    17         observable.registerObserver(people);
    18 
    19         //被观察者发出某一个事件
    20         observable.dataChanged();
    21 
    22     }
    23 
    24 
    25 }

    被观察者保存一个观察者的列表,被观察者状态一变,就遍历观察者列表并调用观察都onChange函数,但是也有一个弊端,如果观察者过多的话,导致被观察者中的列表太大,会有性能上的问题。所以要视情况而定再使用,当然也可以结合线程池等来优化。

    注:设计模式交流学习群 632945466  欢迎所有热爱技术的大牛,小菜,一起学习讨论进步提高,欢迎随时批评指正

  • 相关阅读:
    颜色代码 #000~#FFF & DML案例设计
    SQLScript DML 创建 & 查询 & 序列(条件查询 日起查询 关联查询 子查询 分组查询 查询内容拼接 模糊查询)
    Java JDBC 连接数据库 Demo
    document的JavaScript一些用法
    dxSpreadSheet的报表demo-关于设计报表模板问题
    dxSpreadSheet的报表demo-关于设计报表模板的Datagroup问题
    TJSON的烦人的泄漏
    dxSpreadSheet的报表
    TDXSpreadSheet中自定义公式函数三大步骤
    SVN项目监视器的配置文件
  • 原文地址:https://www.cnblogs.com/start1225/p/6725295.html
Copyright © 2020-2023  润新知