观察者模式

来源:互联网 发布:手机电脑文件软件 编辑:程序博客网 时间:2024/06/04 18:34

观察者模式

基本介绍

定义

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

类图

这里写图片描述

例子

下面以上网的例子实现观察者模式
首先创建一个名为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 进行上机操作此时观察列表大小为:1dylan 充值5元成功dylan 进行下机操作此时观察列表大小为:0

GitHub地址

0 0
原创粉丝点击