观察者模式

观察者模式

基本介绍

定义

观察者模式定义对象之间一对多的关系,当一个对象的状态发生改变时,能够自动通知与其关联的对象,该对象并刷新自己的状态。

类图

这里写图片描述

例子

下面以上网的例子实现观察者模式
首先创建一个名为Observer的工程,创建InternetBarService观察的接口,代码如下:

public interface InternetBarService {
    void onRecharge(int money);
}

创建一个Person类并实现InternetBarService的接口,代码如下:

public class Person implements InternetBarService{
    private String name;

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

    @Override
    public void onRecharge(int money) {
        System.out.println(name + " 充值" + money + "元成功");
    }
}

创建一个名为InternetBarManager收银员类,代码如下:

public class InternetBarManager {
    private InternetBarService mListener;

    public void registerObserver(InternetBarService listner) {
        mListener = listner;
    }

    public void unregisterObserver() {
        mListener = null;
    }

    public void recharge(int money) {
        if (mListener != null) {
            mListener.onRecharge(money);
        }
    }

}

最后实现客户端的调用,代码如下:

public class Main {
    public static void main(String[] args) {
        //初始化网吧管理对象
        InternetBarManager manager = new InternetBarManager();
        //新建一个person对象
        Person person = new Person("dylan");

        System.out.println("dylan 进行上机操作");
        manager.registerObserver(person);

        //充值
        manager.recharge(5);

        System.out.println("dylan 进行下机操作");
        manager.unregisterObserver();
    }
}

运行代码结果如下:

dylan 进行上机操作
dylan 充值5元成功
dylan 进行下机操作

利用java内置的观察者模式实现以上代码

创建InternetBarManager类并继承Observable,代码如下:

package com.dylan.java.inner;

import java.util.Observable;

public class InternetBarManager extends Observable{
    private int money;

    public void recharge(int money) {
        this.money = money;
        //设置状态改变
        setChanged();
        //通知其他对象
        notifyObservers();
    }

    public int getMoney() {
        return money;
    }
}

创建Person类并实现Observer接口,代码如下:

package com.dylan.java.inner;

import java.util.Observable;
import java.util.Observer;

public class Person implements Observer {
    private String name;

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

    @Override
    public void update(Observable o, Object arg) {
        if (o instanceof InternetBarManager) {
            InternetBarManager manager = (InternetBarManager)o;
            System.out.println(name + " 充值" + manager.getMoney() + "元成功");
        }
    }
}

客户端的代码如下:

package com.dylan.java.inner;

public class Main {
    public static void main(String[] args) {
        InternetBarManager manager = new InternetBarManager();

        Person person = new Person("dylan");

        System.out.println("dylan 进行上机操作");
        manager.addObserver(person);
        System.out.println("此时观察列表大小为:"+manager.countObservers());

        manager.recharge(5);

        System.out.println("dylan 进行下机操作");
        manager.deleteObserver(person);
        System.out.println("此时观察列表大小为:"+manager.countObservers());
    }
}

运行代码,结果如下:

dylan 进行上机操作
此时观察列表大小为:1
dylan 充值5元成功
dylan 进行下机操作
此时观察列表大小为:0

GitHub地址

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值