设计模式之观察者模式

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

这里写图片描述

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

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

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

那接下来该怎么办呢?

下回分析..

..
.

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

相关文章推荐

设计模式之策略模式

概要设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。定义策略模式定义了一系列的算法,并将每一个算法封装起来,他们之间还可以相互替换,策略模式独立于使用它的客户而独立变化使用场...

设计模式之Builder模式

概要设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。定义将一个复杂的对象的创建和它的表示分离,可以让不同的创建过程,创建出不同的对象使用场景1.相同的构造,不同的执行方法,产...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

设计模式之工厂方法模式

概要设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。定义定义一个用于创建对象的接口,让其子类去决定实例化那个类使用场景任何使用复杂对象的地方,都可以使用工厂模式UML1.抽象...

设计模式之抽象工厂模式

概要设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。定义为创建一组相关或者相互依赖的对象,提供一个接口,但是不需要指定他们的具体类使用场景一组对象具有相同的约束条件的可以使用...

设计模式之原型模式

概要设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。定义用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象使用场景1.类初始化需要非常多的资源,非常的耗时间 2....

Java Jvm运行机制原理

一:简介在学习Java虚拟机之前,也就是Jvm之前,我想大家能够带着问题去学习,这样的话,大家学习起来也会比较有所获! 1.Java虚拟机(Jvm)是什么? 2.Java虚拟机是用来干什么的? 3...

设计模式之代理模式(静态代理)

概要设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。定义为其它的对象提供一种代理,以控制这个对象的访问使用场景当不想直接访问某个对象的时候,就可以通过代理1.不想买午餐,同事...

设计模式之代理模式(动态代理)

概要设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。简介在上一篇已经大概讲解了代理模式,相信大家对代理模式有一定的了解了,如果没有不妨先去看看上一篇 设计模式之代理模式(静态...

Java 堆和栈的区别

1、概述在Java中,内存分为两种,一种是栈内存,另一种就是堆内存。2、堆内存1.什么是堆内存? 堆内存是是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对象或者创建...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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