设计模式之观察者模式(十二)

观察者模式(发布-订阅模式)

简介

         观察者模式动机,如果我们将一个系统分割成一系列相互协作的类这样带来的副作用就是要维护相关对象间的一致性。这样使得类紧密耦合,并且为维护/扩展和重用带来不便。观察者模式的关键对象是“观察对象”和“观察者”。一个观察对象可以有任意数目的观察者依赖于它。这样在观察对象发生变化的时候就可以通知所有依赖的观察者去做自己想做的事情。现在很流行的消息队列可以看作是观察者模式,消息平台就是观察对象,那么依赖消息平台的其它系统就是观察者,在消息平台发生变化的时候需要通知所有依赖它的系统去做自己要做的事情。观察这模式其实就是这个作用。

类图

实现方式

         小张和小王一起合租房子,他们住的客厅有一个大闹钟,每天闹钟6点钟响的时候,小张就要起床去卖包子,小王呢就起床去卖汤粉。这个场景下,闹钟就担任了观察对象这个角色,小张和小王就是观察者角色,闹钟6点响起的时候就是通知了小张和小王去做自己要做的事情。下面使用代码模拟这个场景:


package com.rabbit.pattern.observer;

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

/**
 * 抽象的闹钟类,Java开发中依赖倒置,不要依赖具体依赖抽象
 * Created by HASEE on 2018/4/1.
 */
public abstract class AbstractNaoZhong {

    protected String name;

    //集合用于放置观察者类,主要来通知
    protected List<AbstractRengWu> lists = new ArrayList<>();

    //添加观察者,即通知对象
    public void add(AbstractRengWu ar) {
        lists.add(ar);
    }

    //删除观察者,
    public boolean delete(AbstractRengWu ar) {
        return lists.remove(ar);
    }

    public void update() {
        for (AbstractRengWu ar : lists) {
            System.out.println(name + "通知:" + ar.name);
            ar.doSomething();//通知观察者做自己的事情
            System.out.println("----------------");
        }
    }

}
package com.rabbit.pattern.observer;

/**
 * 小米牌闹钟
 * Created by HASEE on 2018/4/1.
 */
public class XiaoMiNaoZhong extends AbstractNaoZhong {

    public XiaoMiNaoZhong() {
        this.name = "小米闹钟";
    }

}
package com.rabbit.pattern.observer;

/**
 * 抽象观察者类
 * Created by HASEE on 2018/4/1.
 */
public abstract class AbstractRengWu {

    protected String name;

    //观察者要做的事情
    protected abstract void doSomething();

}
package com.rabbit.pattern.observer;

/**
 * 小王类
 * Created by HASEE on 2018/4/1.
 */
public class XiaoWang extends AbstractRengWu {

    public XiaoWang() {
        this.name = "小王";
    }

    @Override
    protected void doSomething() {
        System.out.println(this.name + "起床去卖汤粉了");
    }

}
package com.rabbit.pattern.observer;

/**
 * 小张类
 * Created by HASEE on 2018/4/1.
 */
public class XiaoZhang extends AbstractRengWu {

    public XiaoZhang() {
        this.name = "小张";
    }

    @Override
    protected void doSomething() {
        System.out.println(this.name + "起床去买包子了");
    }

}
package com.rabbit.pattern.observer;

import org.junit.Test;

/**
 * Created by HASEE on 2018/4/1.
 */
public class Demo {

    @Test
    public void test() {
        AbstractNaoZhong xm = new XiaoMiNaoZhong();
        xm.add(new XiaoWang());
        xm.add(new XiaoZhang());
        xm.update();
    }

}

总结

优点

1.      观察者和被观察者都是抽象耦合

2.      建立一套出发机制

使用场景

1.      一个抽象模型有两个方面,其中一个依赖另一个,可以将这些方面独立封装在对象中使得他们可以各自独立的改变和复用。

2.      一个对象的改变将导致其它一个或者多个对象的改变,而不知道具体有多少个对象将发生改变,可以降低对象之间的耦合度。

3.      一个对象需要通知其它对象,但是不知道这些对象是谁。





展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie
应支付0元
点击重新获取
扫码支付

支付成功即可阅读