设计模式 --- 观察者模式

观察者模式是JDK中使用最多的设计模式之一.

在学习观察者模式之前, 我在网上也找了很多博客, 这些博客都是的讲解都是基于 head first 设计模式 这本书的. 如果看书的话, 很简单就能学会这个设计模式, 但是将书上的内容些成博客, 其实是不太容易理解的. 所以在这篇博客中, 我将用我自己的方式以示例的方式来讲解这个设计模式.


1. 观察者模式是什么? 它解决了什么问题?

(1) 观察者模式是什么?

观察者模式由两个端组成, 分别是通知者(speaker)和观察者(listener). 观察者也可以称为监听者.
speaker和Listener是一对多的关系. 当speaker的状态发生改变时, 可以将这种改变通知给它所有的Listener.

(2) 解决了什么问题?

假如现在speaker里面做了某些操作后, 它需要将这些操作的结果(或者某些数据)告诉它所有的listener, 最容易想到的办法就是通过方法调用来实现, 但是这样就使得这多个listener和speaker之间形成紧耦合.
观察者模式就是为了解决这种一对多模式中的紧耦合问题.

可能你还不是很明白, 怎样解耦和, 那么没关系, 我们来举个栗子.

2. 一个小栗子学会观察者模式

(1) 问题描述

假设现在有这样一个需求, 现在有一个水果类Fruit, 这个类里面的属性分别为多种水果的价格, 现在有这几种水果: apple, banana, peach
现在有三个公司A/B/C, 水果店长期给这三个公司提供水果.
然而, 每天的水果的价格是不一样的, 所以水果店在每天早上都要告诉A/B/C今天水果的价格是什么.

上面这个简单的例子就形成了一个一对多的关系, Fruit VS A/B/C.

通常我们来解决这个问题会在A/B/C的实例对象中分别使用getter获取所需要的价格信息. 但这是在仅仅只有三个listener的情况下, 如果我们再把情况考虑复杂一点.
假设现在有十个公司要从水果店拿货, 并且现在水果店的水果种类有20种, 而这10个公司所需要的水果都各不一样, 难道你还要再在这10个公司的实例对象中逐一gettter吗? 那要是有100个公司, 1000种水果呢?

那么来看一下观察者模式是如何解决这个问题的.


(2) 问题解决

首先我要先说明两点:

  • 1. 在Java中, 解耦通常都要借助接口, 所以观察者模式中, 也是根据接口来达到解耦的目的的;
  • 2. 第二点可能我现在说你会觉得很懵逼, 但是你只需要知道这一点就好了. 在观察者模式中具体有两种模式: 推模式和拉模式. 我下面使用的这种模式属于拉模式.

好了, 下面来看解决方法.


(1) 基础类的设计

1. Fruit.java

public class Fruit {
    private float apple;
    private float banana;
    private float peach;

    public Fruit() { }

    public float getApple() {
        return apple;
    }

    public void setApple(float apple) {
        this.apple = apple;
    }

    public float getBanana() {
        return banana;
    }

    public void setBanana(float banana) {
        this.banana = banana;
    }

    public float</
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值