博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
观察者模式的初始学习--自己实现
阅读量:5077 次
发布时间:2019-06-12

本文共 3808 字,大约阅读时间需要 12 分钟。

观察者模式:首先要理解观察者模式的定义,对象间一对多的关系,当其中的一个Object变化[subject]时,其他的依赖这个对象的对象[Observer],都会受到相应的通知,并且自动更新自己状态.

其中目标对象,是源头:subject,它应该包含有 add()  \  remove()  \  notify()  基本的单个方法,分别用于 注册观察者, 删除观察者,以及通知观察者.

而观察者对象: Observer 则应该有 update()方法,在收到依赖对象的变化通知时候,就自动执行update的方法,更新自己的状态信息.

 

代码实现观察者模式 --->基本的步骤如下:

1,(subject)目标对象(接口)的建立,其中规定统一的方法规则.

2,具体目标类的建立,都必须要实现subject的接口.

3,观察者接口的定义,Observer的接口,包含有update方法.

4,具体的观察者的建立,实现观察者接口.

 

具体的代码如下:

subject的接口的建立:

public interface Subject {    /**     *      * 功能描述: 
* 〈功能详细描述〉注册成为观察者 * * @param observer * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ void registerObserver(Observer observer); /** * * 功能描述:
* 〈功能详细描述〉取消成为观察者 * * @param observer * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ void removeObserver(Observer observer); /** * * 功能描述:
* 〈功能详细描述〉通知所有的观察者 * * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ void notifyObservers();}

 

具体的目标类的建立: 里面是包含了自己写的方便测试的代码.

public class GoodsData implements Subject {    private ArrayList
observers; private String name; private int num; private int price; public GoodsData() { observers = new ArrayList
(); } @Override public void registerObserver(Observer observer) { observers.add(observer); } @Override public void removeObserver(Observer observer) { int i = observers.indexOf(observer); if (i >= 0) { observers.remove(i); } } @Override public void notifyObservers() { for (Observer o : observers) { o.update(name, num, price); } } /** * * 功能描述:
* 〈功能详细描述〉商品参数变化时 通知给个观察者变化 * * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ public void goodsChanged() { notifyObservers(); } /** * * 功能描述:
* 〈功能详细描述〉实时获取商品的参数信息,测试方法 * * @param name * @param num * @param price * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ public void setGoodsData(String name, int num, int price) { this.name = name; this.num = num; this.price = price; goodsChanged(); }}

观察者的接口的定义: 主要定义统一的update方法

public interface Observer {    /**     *      * 功能描述: 
* 〈功能详细描述〉观察者跟新主题最新的数据 * * @param name 名称 * @param num 数量 * @param price 价格 * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ void update(String name, int num, int price);}

 

定义具体的观察者的类定义: 当然,里面也包含了一些方便测试的附加操作代码.

public class SuguoMarket implements Observer, DisplayElement {    private String name;    private int num;    private int price;    private Subject goodsMarket;    public SuguoMarket(Subject goodsMarket) {        this.goodsMarket = goodsMarket;        goodsMarket.registerObserver(this);    }    /**     *      * 功能描述: 
* 〈功能详细描述〉取消注 * * @see [相关类/方法](可选) * @since [产品/模块版本](可选) */ public void removeObserver() { goodsMarket.removeObserver(this); } @Override public void display() { System.out.println("名称:" + name + "数量:" + num + "价格:" + price); } @Override public void update(String name, int num, int price) { this.name = "苏果" + name; this.num = num; this.price = price; display(); }}

 

最后简单的写个测试类的代码,方便运行查询实时效果:

public class MarkertTest {    public static void main(String[] args) {        GoodsData goods = new GoodsData();        SuguoMarket suguo = new SuguoMarket(goods);        goods.setGoodsData("香烟", 20, 100);        goods.setGoodsData("啤酒", 100, 5);        goods.setGoodsData("可樂", 100, 2);        // 取消注册        suguo.removeObserver();        goods.setGoodsData("口香糖", 100, 2);    }}

 

到此为止,一个简单的观察者模式就建立完成了,后面会继续采用java的jdk自有的api来实现观察者模式

转载于:https://www.cnblogs.com/lilin0719/p/5218178.html

你可能感兴趣的文章
获取元素
查看>>
proxy写监听方法,实现响应式
查看>>
第一阶段冲刺06
查看>>
十个免费的 Web 压力测试工具
查看>>
EOS生产区块:解析插件producer_plugin
查看>>
mysql重置密码
查看>>
jQuery轮 播的封装
查看>>
一天一道算法题--5.30---递归
查看>>
JS取得绝对路径
查看>>
排球积分程序(三)——模型类的设计
查看>>
python numpy sum函数用法
查看>>
php变量什么情况下加大括号{}
查看>>
linux程序设计---序
查看>>
【字符串入门专题1】hdu3613 【一个悲伤的exkmp】
查看>>
C# Linq获取两个List或数组的差集交集
查看>>
HDU 4635 Strongly connected
查看>>
ASP.NET/C#获取文章中图片的地址
查看>>
Spring MVC 入门(二)
查看>>
格式化输出数字和时间
查看>>
页面中公用的全选按钮,单选按钮组件的编写
查看>>