设计模式之观察者模式

原创 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)结果

这里写图片描述

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

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

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

那接下来该怎么办呢?

下回分析..

..
.

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

相关文章推荐

设计模式--观察者模式java例子

  • 2017年02月06日 17:18
  • 43KB
  • 下载

Unity游戏设计模式(二)观察者模式(Observer Pattern)

最近看游戏设计模式,当看到观察者模式时被搞得云里雾里的,什么观察者,被观察者,抽象观察者,抽象被观察者。听着这些词就觉得可怕,其实理解以后还是比较简单的。         当我们玩游戏时,经常会出现...
  • RinKas
  • RinKas
  • 2016年10月08日 14:32
  • 2055

设计模式之观察者模式

  • 2016年12月27日 13:41
  • 9KB
  • 下载

java23种设计模式之观察者模式

  • 2011年05月20日 14:10
  • 3KB
  • 下载

设计模式学习笔记--观察者模式

一.简介 观察者模式是一种灰常灰常重要的设计模式!在我们编程的时候经常会用到观察者模式,虽然我们自己可能并不知道。观察者模式又叫做发布-订阅模式。定义了一种一对多的依赖关系,让多个观察者同时监听同一个...

23钟设计模式之观察者模式

  • 2013年08月13日 10:44
  • 18KB
  • 下载

java设计模式之观察者模式

  • 2013年11月05日 14:25
  • 7KB
  • 下载

设计模式读书笔记-----观察者模式

学习设计模式已经有段时间了,这是总结的第一篇博客,文中有错误、漏洞之处,望各位支出,改正。                          观察者模式         一、基本定义    ...
  • chenssy
  • chenssy
  • 2013年05月21日 15:42
  • 9702

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

  • 2011年07月07日 09:36
  • 11KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式之观察者模式
举报原因:
原因补充:

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