设计模式之观察者模式

原创 2016年08月30日 12:02:40

概要

设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。

定义

对象间一对多的关系,当对象发生改变,所有跟其对象依赖的对象都会得到通知,发生改变

使用场景

1、夜间模式,关联行为场景
2、事件多级触发改变
3、消息交换场景,通知改变

UML

这里写图片描述

看上面的图,我们应该能够很清晰的知道,他们之间的情况。

(1)被观察者

被观察者:只能有一个,它也只有一个方法,那就是通知所有的观察者

(2)具体观察者

具体观察者:具体观察者实现了抽象被观察者,复写nofifyObervable方法,里面也添加了自己的一些方法,比如:移除观察者,添加观察者。

(3)观察者

观察者:观察者内部也有一个方法,那就是更新,也就是说,当被观察者通知的时候,我们可以在此方法中接收到信息,从而做一些自己的事情。

(4)具体观察者

具体观察者:同上,具体需求具体实现。

代码实现

上面我们已经很清晰的明白了他们之间的关系,所以接下来就用代码演示,将上面我们的想法和逻辑用代码表现出来:

(1)抽象被观察者

package com.zengtao.demo.observer;

/**
 * 被观察者
 */
public interface Obervable {

    public void notifyObserver();

    public void addOberver(Observer observer);

    public void removeObserver(Observer observer);

}

(2)具体观察者

package com.zengtao.demo.observer;

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

/**
 * 具体被观察者:明星
 */
public class Start implements Obervable {

    private static List<Observer> list = new ArrayList<Observer>();

    private String name;
    private String singName;

    public Start() {

    }

    public Start(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setSingName(String singName) {
        this.singName = singName;
    }

    public String getSingName() {
        return singName;
    }

    @Override
    public void notifyObserver() {
        notifys();
    }

    @Override
    public void addOberver(Observer observer) {
        if (list != null) {
            list.add(observer);
        }
    }

    @Override
    public void removeObserver(Observer observer) {
        if (list != null) {
            list.remove(observer);
        }
    }

    private void notifys() {
        if (list == null) {
            return;
        }
        for (int i = 0; i < list.size(); i++) {
            list.get(i).update(",你关注的:" + this.name + " 有新消息更新了,歌曲:" + getSingName() + ",上榜了");
        }
    }
}

(3)抽象观察者

package com.zengtao.demo.observer;

/**
 * 观察者
 */
public interface Observer {

    void update(String content);

}

(4)具体观察者

package com.zengtao.demo.observer;

/**
 * 具体观察者:粉丝
 */
public class Fan implements Observer {

    private String name;

    public Fan() {

    }

    public Fan(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    @Override
    public void update(String content) {
        System.out.println("hi," + this.name + content);
    }

}

(5)调用

package com.zengtao.demo;

import com.zengtao.demo.observer.Fan;
import com.zengtao.demo.observer.Start;

public class Main {

    public static void main(String[] str) {
        /**
         * 1.创建被观察者
         * 2.创建观察者
         * 3.将观察者和被观察者添加联系
         * 4.通知观察者改变
         */

        Start starts = new Start("胡**");
        starts.setSingName("六月的雨");

        Fan fan1 = new Fan("粉丝-西瓜");
        Fan fan2 = new Fan("粉丝-土豆");
        Fan fan3 = new Fan("粉丝-南瓜");
        Fan fan4 = new Fan("粉丝-苹果");

        starts.addOberver(fan1);
        starts.addOberver(fan2);
        starts.addOberver(fan3);
        starts.addOberver(fan4);

        starts.notifyObserver();
    }
}

(6)结果

这里写图片描述

以上就完成了,整个观察者模式的设计,但是,不知道有没有发现一个问题

在调用的时候,都是有被观察者去添加观察者或者移除观察者?

这跟现实是完成不符合的,我们知道,平时粉丝订阅的时候,都是自己想订阅那就订阅,想取消就取消,是观察者去做的,而不是被观察者。。。

那接下来该怎么办呢?

下回分析..

..
.

版权声明:本文为博主原创文章,欢迎转载和分享,转载请标明出处!

《设计模式之禅》学习小结之观察者模式,门面模式和备忘录模式

一。观察者模式
  • aid414944
  • aid414944
  • 2014年04月15日 08:59
  • 666

设计模式——观察者模式(Observer)

要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 设计模式学习笔记,欢迎交流。 ——Shulin 转载请注明出处:http://blog.csdn.net/zhsh...
  • u012909091
  • u012909091
  • 2014年08月20日 16:52
  • 2945

大话西游之设计模式_起手篇

介绍了设计模式是什么。能干什么、及怎么运用? 通过西游记中故事的分析,将常用设计模式融合在故事的实现中,帮助大家理解&记住各种设计模式的概念及使用方法。 达到活学活用的情况~...
  • myhc2014
  • myhc2014
  • 2015年10月15日 10:52
  • 747

设计模式(五)观察者模式

观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听莫一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们...
  • itachi85
  • itachi85
  • 2016年03月02日 17:41
  • 40375

设计模式在游戏开发中的应用之观察者模式

观察者模式 1.通俗的定义         触发事件的一方不关心谁来处理,处理事件的一方不关心事件是从哪里来的。观察者模式就是让观察者与被观察者彻底解耦。 2.2.结构图如下(图片来源与网络): ...
  • yue19870813
  • yue19870813
  • 2016年11月12日 16:44
  • 699

回调函数升级版-设计模式(观察者模式)

书接上回,上一周大体写了一下回调函数的使用,这周我就大体说一下设计模式中的观察者模式。我自己认为观察模式就是回调函数的升级版,在用法上。废话少说,直接上图。 这是我正在弄的一个应用,画面有点模仿荔枝...
  • liujianshui
  • liujianshui
  • 2015年07月07日 14:32
  • 781

Qt信号槽与观察者模式

qt的核心机制:信号与槽和设计模式中的观察者模式很类似。 https://www.devbean.net/2012/08/qt-study-road-2-custom-signal-slot 这篇...
  • u011391629
  • u011391629
  • 2017年03月20日 21:59
  • 1106

设计模式-深入解析观察者模式(Observer)

在上篇设计模式上我们继续前进把,苦逼(酷毙)的程序员一刻都不能松懈的,要紧跟脚步,每天都学习啊!!学了策略模式,我自己去用设计模式写了几个例子,感觉还扣以啊。下面继续总结一下观察者模式的学习,如有不正...
  • qq_29282475
  • qq_29282475
  • 2015年12月07日 16:16
  • 1317

Java设计模式-回调函数和观察者模式

Android的框架中有非常多的地方使用了回调的模式,例如Activity的生命周期,按钮的点击事件等。 下面是回调的基本模型: public class A { private CallBack...
  • cauchyweierstrass
  • cauchyweierstrass
  • 2015年03月24日 16:20
  • 8981

Unity设计模式:观察者模式

初学编程的时候内容比较少没有数据交互,等内容多到需要多个文件多个类协同运行的时候就涉及到类之间的数据交互了。比较简单的数据交互是这些类之间互相引用,直接或间接传值或调用,但是这样类之间的耦合性太高了,...
  • ylbs110
  • ylbs110
  • 2016年12月31日 08:36
  • 543
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式之观察者模式
举报原因:
原因补充:

(最多只允许输入30个字)