疯狂飞艇

当前位置:疯狂飞艇 > IT教程

【设计模式】最常用的设计模式之一的观察者模式

时间:2021-01-18 06:04:15来源:金橙教程网 作者:admin8 阅读:63次
 

观察者模式

这里写图片描述

以下是之前做的“产品详情页”的长截图,这里讲解一下这个页面与“观察者模式”的关系:在活动季,底部的“开始预订按钮”会变成“秒杀按钮”(所谓秒杀按钮,就是一个显示成灰色不可点击,并且一直处于倒计时状态的按钮,直到到达秒杀时间,比如0点整,秒杀按钮才由灰色变为橘黄色,并且可以点击), 当秒杀时间到时,不光底部的“秒杀按钮”变为“开始预订按钮”,可选班期的几个按钮也从灰色不可点击状态,变为白色可点击状态。相信熟悉设计模式的人已经想到这就是“观察者模式”。

观察者模式,应该是很多人学设计模式时,学的第一个设计模式吧>

最近在研究redux源码时,也看到了观察者模式,想来这个这么常用的设计模式我还没有写过文章介绍,并且对于这个设计模式我还是有一定心得的,于是就有了这篇文章。。

一. 观察者模式简介

1. 定义

观察者模式:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖它的对象都会得到通知并自动更新

2. 意义

此设计模式最重要的作用就是 解耦!将观察者与被观察者解耦,使得他们之间的依赖性更小。

###3. uml

这里写图片描述

  • Subject:就是“被观察”的角色,它将所有观察者对象的引用保存在一个集合中。
  • ObServer:是抽象的“观察”角色,它定义了一个更新接口,使得在被观察者状态发生改变时通知自己。
  • ConcreteObserver:具体的观察者。

二. 观察者模式实现

以上理论相信大家并不模式,现在我们来应用到实际中。

1. 被观察者Subject对象

首先是一个Subject类的父类,它实现了维护装有观察者引用集合的功能。

public class Subject {
    //保存注册的观察者对象
    private List<Observer> mObervers = new ArrayList<>();

    //注册观察者对象
    public void attach(Observer observer) {
        mObervers.add(observer);
        Log.e("SZH", "attach an observer");
    }

    //注销观察者对象
    public void detach(Observer observer) {
        mObervers.remove(observer);
        Log.e("SZH", "detach an observer");
    }

    //通知所有注册的观察者对象
    public void notifyEveryOne(String newState) {
        for (Observer observer : mObervers) {
            observer.upDATe(newState);
        }
    }
}

接着是一个具体的被观察者对象

public class ConcreteSubject extends Subject {
    private String state;

    public String getState() {
        return state;
    }

    public void change(String newState) {
        state = newState;
        Log.e("SZH", "concreteSubject state:" + newState);

        //状态发生改变,通知观察者
        notifyEveryOne(newState);
    }
}

2. 观察者Observer对象

首先是一个接口,抽象出了一个及时更新的方法

public interface Observer {
    void update(String newState);
}

接着是几个观察者对象。

public class ObserverA implements Observer {

    //观察者状态
    private String observerState;

    @Override
    public void update(String newState) {
        //更新观察者状态,让它与目标状态一致
        observerState = newState;
        Log.e("SZH", "接收到消息:" + newState + ";我是A模块,快来抢吧!!");
    }
}

public class ObserverB implements Observer {
    //观察者状态
    private String observerState;

    @Override
    public void update(String newState) {
        //更新观察者状态,让它与目标状态一致
        observerState = newState;
        Log.e("SZH", "接收到消息:" + newState + ";我是B模块,快来抢吧!!");
    }
}

public class ObserverC implements Observer {
    //观察者状态
    private String observerState;

    @Override
    public void update(String newState) {
        //更新观察者状态,让它与目标状态一致
        observerState = newState;
        Log.e("SZH", "接收到消息:" + newState + ";我是C模块,快来抢吧!!");
    }
}

为了让大家更好的理解,以上uml图可以通过下面这个图更好地记忆。

这里写图片描述

三. 最后

以上设计模式的代码都已经集成到demo中,疯狂飞艇下载查看。

该demo会陆续集成各种设计模式,疯狂飞艇关注。

参考

https://blog.CSDN.net/itermeng/article/details/52595691

Https://my.oschina.net/122612475/blog/834686

http://www.cnblogs.com/mythou/p/3370340.html

相关阅读

小米5怎么进入Bootloader模式

内容摘要:小米5怎么进入Bootloader模式?一起看看吧!

简单易懂商业模式(一)

这标题有点唬人啊,被标题骗进来的同学别走啊,找个领导看不见的地方看完再走,或许看过后你能达到领导的高度……只是或许……今天呢讲

暗黑3专家模式新手指南

内容摘要:本文为大家介绍一下暗黑3专家模式新手指南,希望对大家有帮助。

设计模式(一):策略模式

设计模式(一):策略模式 本文将以一个小Demo及其新需求来分析使用策略模式的好处。设计模式简述:设计模式:1.设计模式是人们在面对同类

盘点互联网十大主要运营模式

短短的十年,互联网发展起来,几乎贯穿了今天我们每一个人的工作、爱情、理想、生命……网站应该有什么,网民需要什么,网站需要什么技术

分享到:

IT相关

程序相关

推荐文章

热门文章

疯狂飞艇官网疯狂飞艇网址疯狂飞艇平台疯狂飞艇app疯狂飞艇下载