观察者模式
来源:互联网 发布:手机电脑文件软件 编辑:程序博客网 时间: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
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- 观察者模式
- centos6.4搭建apache+mysql+php环境
- 【bzoj 1588】 [HNOI2002]营业额统计
- 系统无处不在
- 最小编辑距离
- 浅谈Linux信号机制
- 观察者模式
- asdad
- GetQueuedCompletionStatus返回ERROR_SEM_TIMEOUT
- 【Python&NLP】Python入门、自然语言处理以及nltk的安装
- 机器学习->推荐系统->userCF算法
- 弄清java中的同步锁
- 【死磕Java并发】-----J.U.C之AQS:AQS简介
- 怎样突破绩效激励鸿沟
- HTTP响应状态码