开发模式之观察者模式(一)——非Java内置方式

一、概述

观察者模式的实现可以分为两种,这里先使用第一种实现方式(非 Java 内置方式)。

观察者模式简单来说就是“观察者”监听“被观察者”,一旦“被观察者”发生了变更,则会被“观察者”发现,那么“观察者”就可以根据“被观察者”的变更做出相应的处理。实际上这里所谓的监听,是由被观察者主动通知观察者的。

在观察者模式中,比较重要的地方:被观察者的实现,定义观察者集合,定义观察者的增加、删除、通知方法(通知观察者)。观察者模式定义了对象之间的一对多的依赖关系,这样一来,当一个对象改变状态时,他的所有依赖者(观察者)都会收到通知并自动更新。一个被观察者可以拥有多个观察者,并且通过接口对观察者与被观察者进行逻辑解耦,降低二者的直接耦合。

我们通过公司与公司各事业部之间的公告来实现一下。

如上图中所示:直接上一段测试代码

被观察者接口:

package notice;

/**
 * 公告接口
 * 对象使用此接口注册为观察者,或将对象自身从观察者中删除
 * 由被观察者实现
 *
 * @author Scott
 * @date 2019年10月16号
 */
public interface Notice {
    /**
     * 注册为观察者
     * @param o 观察者对象
     */
    void registerObserver(Observer o);

    /**
     * 删除观察者
     * @param o 观察者对象
     */
    void removeObserver(Observer o);

    /**
     * 通知方法
     */
    void notifyObservers();
}

被观察者:

package notice;

import java.util.ArrayList;
import java.util.List;

/**
 * 被观察者(公司总部公告通知)
 *
 * @author Scott
 * @date 2019年10月16号
 */
public class HeadquartersNotice implements Notice {

    /** 观察者集合 */
    private List<Observer> observerArrayList;
    /** 变更内容 */
    private String notice;

    /**
     * 构造方法
     */
    public HeadquartersNotice() {
        this.observerArrayList = new ArrayList<>(10);
    }

    /**
     * 注册观察者
     * @param o 观察者对象
     */
    @Override
    public void registerObserver(Observer o) {
        observerArrayList.add(o);
    }

    /**
     * 移除观察者
     * @param o 观察者对象
     */
    @Override
    public void removeObserver(Observer o) {
        if (null == o) {
            return;
        }
        int i = observerArrayList.indexOf(o);
        if (i >= 0) {
            observerArrayList.remove(i);
        }
    }

    /**
     * 通知观察者
     */
    @Override
    public void notifyObservers() {
        observerArrayList.stream().forEach(observer -> observer.update(notice));
    }

    public String getNotice() {
        return notice;
    }

    /**
     * “被观察者” 发生变更时调用 notifyObservers() 方法通知观察者
     * 发布新公告时触发通知公司下所有注册了的事业部
     *
     * @param notice 通知内容
     */
    public void setNotice(String notice) {
        this.notice = notice;
        notifyObservers();
    }
}

观察者接口

/**
 * 观察者接口
 *
 * @author Scott
 * @date 2019年10月16号
 */
public interface Observer {

    /**
     * 更新方法
     * @param string
     */
    void update(String string);
}
/**
 * “观察者” 观察到 “被观察者” 发生变更后做出处理的公共接口
 *
 * @author Scott
 * @date 2019年10月16号
 */
public interface LowerHair {
    /**
     * 下发通知接口
     */
    void lowerHair();
}

 

观察者A

package notice;

/**
 * 观察者A(第九事业部)
 *
 * @author Scott
 * @date 2019年10月16号
 */
public class DivisionNine implements Observer, LowerHair {

    /** 被观察对象 */
    private Notice notice;
    /** 变更内容 */
    private String string;

    /**
     * 构造方法
     * 将自身设置为观察者
     *
     * @param notice 被观察者
     */
    public DivisionNine(Notice notice) {
        this.notice = notice;
        notice.registerObserver(this);
    }

    @Override
    public void update(String string) {
        this.string = string;
        lowerHair();
    }

    @Override
    public void lowerHair() {
        System.out.println("第九事业部公司决策通知:" + this.string);
    }
}

观察者B

package notice;

/**
 * 观察者B (第八事业部)
 *
 * @author Scott
 * @date 2019年10月16号
 */
public class DivisionEight implements Observer, LowerHair{

    /** 被观察对象 */
    private Notice notice;
    /** 变更内容 */
    private String string;

    /**
     * 构造方法
     * @param notice 被观察者
     */
    public DivisionEight(Notice notice) {
        this.notice = notice;
        // 注册观察者
        notice.registerObserver(this);
    }

    @Override
    public void update(String string) {
        this.string = string;
        lowerHair();
    }

    @Override
    public void lowerHair() {
        System.out.println("第八事业部公司决策通知:" + string);
    }

}

测试类:

package notice;

/**
 * 测试类
 *
 * @author Scott
 * @date 2019年10月16号
 */
public class TestCompany {
    public static void main(String[] args) {
        HeadquartersNotice headquartersNotice = new HeadquartersNotice();

        DivisionNine divisionNine = new DivisionNine(headquartersNotice);
        DivisionEight divisionEight = new DivisionEight(headquartersNotice);

        headquartersNotice.setNotice("根据公司发展需要,经研究决定,对第九事业部组织结构调整如下:XXXXXXXX ");
    }
}

测试结果:

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值