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

    简述:

    当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

    观察者模式适用场景

    当一个抽象模型有两个方面,其中一个方面依赖于另一个方面。
    当对一个对象的改变需要同时改变其它对象,而不知道具体有多少个对象待改变。
    当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换句话说,你不希望这些对象是紧密耦合的,做到(松耦合,高内聚)

    下面通过一个案例:传入一个状态,并执行相关的业务操作

    代码实例:

    定义一个抽象观察者类

    public interface Observer {
    
        /**
         * 当观察者接收到状态时,执行update方法的业务逻辑
         * @param state
         */
        void update(String state);
    }

    实现两个具体的观察者

     ObserverA与ObserverB

    public class ObserverA implements Observer{
    
        @Override
        public void update(String state) {
            System.out.println("ObserverA接收到状态:"+state + ",实行相关的业务逻辑");
        }
    }
    public class ObserverB implements Observer{
    
        @Override
        public void update(String state) {
            System.out.println("ObserverB接收到状态:"+state+",执行相关的业务逻辑");
        }
    }

     定义抽象的主题,用于注册所有的观察者

    public abstract class Subject {
    
        /**
         * 观察的集合
         */
        private List<Observer> list = new ArrayList<>();
    
        /**
         * 添加观察者对象(注册)
         * @param observer
         */
        public void addObserver(Observer observer){
            list.add(observer);
        }
    
        /**
         * 移除观察者
         * @param observer
         */
        public void removeObserver(Observer observer){
            list.remove(observer);
        }
    
        /**
         * 通知所有的观察者,
         * 并且观察者会依据这个通知执行自身相关的业务逻辑
         *
         * 其实就是调用所有观察者的具体行为
         * @param state
         */
        protected void notifyObserver(String state){
            for (Observer observer : list) {
                observer.update(state);
            }
        }
    }

    具体的主题,有一个独有的change()方法

    public class SubjectA extends Subject{
    
        /**
         * 主题发生变化时,执行此方法
         */
        public void change(String state){
            notifyObserver(state);
        }
    }

     测试(Main)类

    public class Main {
    
        public static void main(String[] args) {
            //创建主题
            SubjectA a = new SubjectA();
            //创建观察者
            Observer o1 = new ObserverA();
            Observer o2 = new ObserverB();
            //注册所有的观察者
            a.addObserver(o1);
            a.addObserver(o2);
    
            a.change("create");
        }
    }
  • 相关阅读:
    CDH6.2安装之离线方式
    impala
    Oracle
    性能调优之Mapping
    Informatica
    性能瓶颈之System
    性能瓶颈之Session
    本地Oracle客户端11g升级12c导致PowerCenter无法连接ODBC数据源
    性能瓶颈之Mapping
    性能瓶颈之Source
  • 原文地址:https://www.cnblogs.com/ywbmaster/p/9805349.html
Copyright © 2011-2022 走看看