美文网首页
观察者模式

观察者模式

作者: 非文666 | 来源:发表于2018-04-20 17:31 被阅读0次

今天接触公司项目代码,发现使用了观察者设计模式,在这里做一下总结。
使用观察者模式,有如下好处:

  1. 可以使代码结构更加清晰有调理,
  2. 处理逻辑类变成可插拔的,耦合性较低
  3. 代码变得更通用

1. 关键概念

  • 观察者
    实现业务逻辑
  • 被观察者(观察者的容器)
    (1) 注册观察者
    (2) 删除观察者
    (3) 通知观察者(遍历观察者并调用他的业务逻辑方法)

2. 实现

  • 实现被观察者的接口
/**
 * 实现观察者模式
 * 观察器控制接口(被观察者)
 * 负责实现注册观察者、删除观察者、通知观察者
 * Created by feiwen on 2018/4/20.
 */
public interface EventListenerManger {
    /**
     * 注册观察者
     * @param e
     */
    void registerListener(MyEventEnum myEventEnum,MyEventListener e);

    /**
     * 删除观察者
     * @param e
     */
    void removeListener(MyEventEnum myEventEnum,MyEventListener e);

    /**
     * 通知所有的观察者
     */
    void fireEvent(MyEventEnum myEventEnum);
  • 实现被观察者的实现类
import org.springframework.stereotype.Component;

import java.util.EnumMap;
import java.util.Map;
import java.util.Vector;

/**
 * Created by feiwen on 2018/4/20.
 */
@Component
public class EventListenerMangerImpl implements EventListenerManger {
//这里集合使用map集合可以将观察者进行分类,不同类别,同时拥有几个观察者
    private static Map<MyEventEnum, Vector<MyEventListener>> eventListeners=new EnumMap<MyEventEnum, Vector<MyEventListener>>(MyEventEnum.class);

    @Override
    public void registerListener(MyEventEnum myEventEnum,MyEventListener e) {
        Vector<MyEventListener> listeners=eventListeners.get(myEventEnum);
        if(listeners==null){
            listeners=new Vector<>();
        }else{
            for (MyEventListener listener:listeners){
                if(listener.getClass()==e.getClass()){
                    return;
                }
            }
        }
        listeners.add(e);
        eventListeners.put(myEventEnum,listeners);
    }


    @Override
    public void removeListener(MyEventEnum myEventEnum,MyEventListener e) {
        Vector<MyEventListener> listeners=eventListeners.get(myEventEnum);
        if(listeners!=null){
            listeners.remove(e);
        }
    }

    @Override
    public void fireEvent(MyEventEnum myEventEnum) {
        Vector<MyEventListener> listeners=eventListeners.get(myEventEnum);
        if(listeners!=null){
            for(MyEventListener listener:listeners){
                listener.fire();
            }
        }
    }
}
  • 实现观察者接口

/**
 * Created by feiwen on 2018/4/20.
 */
public interface MyEventListener {
    /**
     * 触发事件实现业务逻辑
     */
    void fire();
}
  • 实现观察者的实现类
/**
 * 实现观察者模式
 * 观察者接口
 * 负责实现业务逻辑
 * Created by feiwen on 2018/4/20.
 */
public class CallBackEventListener implements MyEventListener{

    @Override
    public void fire() {
        System.out.println("触发callback的业务逻辑");
    }
}
  • 枚举类
/**
 * 事件枚举类
 * Created by feiwen on 2018/4/20.
 */
public enum MyEventEnum {
    CALLBACK_EVENT;
}
  • 调用方
@RequestMapping("/testListener")
    public void testListener(){
        logger.info("进入监听器的测试方法");
        eventListenerManger.registerListener(MyEventEnum.CALLBACK_EVENT,new CallBackEventListener());
        eventListenerManger.fireEvent(MyEventEnum.CALLBACK_EVENT);
    }

优化

在观察者代码中可以在构造方法中将自己注册到被观察中,这样就不用在调用发使用注册方法。

相关文章

  • 11.9设计模式-观察者模式-详解

    设计模式-观察者模式 观察者模式详解 观察者模式在android中的实际运用 1.观察者模式详解 2.观察者模式在...

  • RxJava基础—观察者模式

    设计模式-观察者模式 观察者模式:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式...

  • 前端面试考点之手写系列

    1、观察者模式 观察者模式(基于发布订阅模式) 有观察者,也有被观察者。 观察者需要放到被观察者列表中,被观察者的...

  • RxJava 原理篇

    一、框架思想 观察者模式观察者自下而上注入被观察者被观察者自上而下发射事件观察者模式 装饰器模式自上而下,被观察者...

  • 观察者模式

    观察者模式概念 观察者模式是对象的行为模式,又叫作发布-订阅(publish/subscrible)模式。 观察者...

  • 设计模式-观察者模式

    观察者模式介绍 观察者模式定义 观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为...

  • 观察者模式

    观察者模式 观察者模式的定义 观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/s...

  • iOS设计模式之观察者模式

    观察者模式 1、什么是观察者模式 观察者模式有时又被称为发布(publish)-订阅(Subscribe)模式、模...

  • 观察者模式和发布订阅模式区别

    观察者模式 所谓观察者模式,其实就是为了实现松耦合(loosely coupled)。 在观察者模式中,观察者需要...

  • RxJava(二)

    一、观察者模式 1.1、传统的观察者模式 1.2、RxJava 的观察者模式 区别传统的观察者模式是一个 Obse...

网友评论

      本文标题:观察者模式

      本文链接:https://www.haomeiwen.com/subject/nbdzkftx.html