设计模式之观察者模式

概要

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

定义

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

使用场景

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

这里写图片描述

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

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

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

那接下来该怎么办呢?

下回分析..

..
.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值