设计模式之观察者模式

栏目: 后端 · 发布时间: 6年前

内容简介:大家上学时最害怕的是什么?是不是还被“班主任突然出现在你后面”的恐惧支配着?时不时就得往窗口、门口望一望,老师没过来就接着看小说,老师一过来当然得假装着写作业。万一我们坐在靠近里面的,不方便观察,这时候我们就只能让坐在窗边的王XX代劳了,王XX一看到老师来了,就喊一声,这时我们就明白怎么回事了。定义:观察者模式是软件设计模式的一种。在此种模式中,一个注意点:

大家上学时最害怕的是什么?是不是还被“班主任突然出现在你后面”的恐惧支配着?时不时就得往窗口、门口望一望,老师没过来就接着看小说,老师一过来当然得假装着写作业。万一我们坐在靠近里面的,不方便观察,这时候我们就只能让坐在窗边的王XX代劳了,王XX一看到老师来了,就喊一声,这时我们就明白怎么回事了。

一、定义

定义:观察者模式是软件 设计模式 的一种。在此种模式中,一个 目标物件管理所有相依于它的观察者物件 ,并且在 它本身的状态改变时主动发出通知 。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

注意点:

1、被观察者管理观察者

2、被观察者状态改变时主动发出通知

二、UML类图

在文章开头的描述中,“王XX”看到老师来了就给其他同学发个信号,通知一下。“王XX”是被其他同学观察,即为被观察者。 其他同学则为观察者。

我们定义了一个

Oberable接口,被观察者接口,接口中定义了四个方法:

(1)teacherLeave()            用来发出消息,表示老师离开了

(2)teacherComeBack()   用来发出消息,表示老师回来了

(3)addNotificationStudent()   “王XX”同学不可能通知所有同学啊,需要通知的同学需要事先跟“王XX”同学说下。

(4)deleteNotificationStudent()  "小丫"同学,现在不需要通知了,通过这个方法让“王XX”同学不再通知她

WangStudent类,表示“王XX”,保存需要通知的同学名单,老师来了就通知这些同学。

IObservor观察者接口,有个方法用来接收“王XX”同学发来的通知。

ObersorStuLi、ObersorStuZhang,李同学、张同学,具体的观察类。

设计模式之观察者模式

三、代码实现

被观察者接口

package com.design.observor;

public interface Observable {

    public void teacherLeave();

    public void teacherComeBack();

    public void addNotificationStudent(IObservor observor);

    public void deleteNotificationStudent(IObservor observor);

}复制代码

被观察者“王XX”同学

package com.design.observor;

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

public class WangStudent implements Observable {

    private int state;
    //需要通知的名单。管理观察者,对应定义注意点1
    private List<IObservor> obserbors;

    public WangStudent(){
        obserbors = new ArrayList<>();
    }

    //通知需要通知的同学,老师走了
    @Override
    public void teacherLeave() {
        state = 1;
        //被观察者,主动发出通知,对应定义注意点2
        Iterator<IObservor> iterator = obserbors.listIterator();
        while (iterator.hasNext()){
            iterator.next().updateOperation(state);
        }
    }

    //通知需要通知的同学,老师来了
    @Override
    public void teacherComeBack() {
        state = 0;
        Iterator<IObservor> iterator = obserbors.listIterator();
        while (iterator.hasNext()){
            iterator.next().updateOperation(state);
        }
    }
    //增加需要通知的同学
    @Override
    public void addNotificationStudent(IObservor observor) {
        obserbors.add(observor);
    }
    //删除不需要通知的同学
    @Override
    public void deleteNotificationStudent(IObservor observor) {
        obserbors.remove(obserbors);
    }
}复制代码

观察者接口

package com.design.observor;

public interface IObservor {

    public void updateOperation(int state);
}复制代码

观察者同学,“李同学”、“张同学”

package com.design.observor;

public class ObservorStuLi implements IObservor{

    @Override
    public void updateOperation(int state) {
        if(state == 0){
            System.out.println("LiXX:老师来了,把小说收了,假装做题!!");
        }else{
            System.out.println("LiXX:老师走了,继续看小说!!");
        }
    }
}
复制代码
package com.design.observor;

public class IObservorStuZhang implements IObservor {
    @Override
    public void updateOperation(int state) {
        if(state == 0){
            System.out.println("ZhangXX:老师来了,停止跟XX调情,假装做题!!");
        }else{
            System.out.println("ZhangXX:老师走了,继续跟XX调情!!");
        }
    }
}复制代码

测试类

package com.design.observor;

public class TestMain {

    public static void main(String[] args) {
        Observable wangStu = new WangStudent();

        IObservor liStu = new ObservorStuLi();
        IObservor zhangStu = new IObservorStuZhang();
        //李同学、张同学增加到需要通知的名单中
        wangStu.addNotificationStudent(liStu);
        wangStu.addNotificationStudent(zhangStu);
        //老师来了
        wangStu.teacherComeBack();
        //老师走了
        wangStu.teacherLeave();

    }
}复制代码

测试结果

设计模式之观察者模式

好了,我们完成了这个场景的编程,老师来了、走了,“王XX”同学都通知了张同学,还有李同学,这时张同学、李同学就可以放心玩他们想玩的了。

四、总结

使用场景:当一个对象的改变需要同时改变其他对象,且不知道具体有多少对象待改变时(我们例子中需要通知的同学是通过addNotificationStudent方法动态增加进去的),可以考虑使用观察者模式( 来自《大话设计模式》

(一)、优点

1、观察者和被观察者是抽象耦合的。

(二)、缺点

1、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,导致死循环。(A通知B,B通知A,A通知B,B通知A ......)


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

精益数据分析

精益数据分析

[加] 阿利斯泰尔·克罗尔、[加] 本杰明·尤科维奇 / 韩知白、王鹤达 / 人民邮电出版社 / 2014-12 / 79.00元

本书展示了如何验证自己的设想、找到真正的客户、打造能赚钱的产品,以及提升企业知名度。30多个案例分析,全球100多位知名企业家的真知灼见,为你呈现来之不易、经过实践检验的创业心得和宝贵经验,值得每位创业家和企业家一读。 深入理解精益创业、数据分析基础,和数据驱动的思维模式 如何将六个典型的商业模式应用到各种规模的新企业 找到你的第一关键指标 确定底线,找到出发点 在大......一起来看看 《精益数据分析》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具