zoukankan      html  css  js  c++  java
  • Java设计模式菜鸟系列(两)建模与观察者模式的实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39755577


    观察者(Observer)模式定义:在对象之间定义了一对多的依赖关系,这样一来。当一个对象改变状态时,依赖它的对象都会收到通知并自己主动跟新。Java已经提供了对观察者Observer模式的默认实现, Java对观察者模式的支持主要体如今Observable类和Observer接口。

    先看uml模型图:


    一、UML模型图


    二、代码实现

    /** 演示样例:咱们去菜市场买菜
     * 
     * 小商贩--主题
     */
    class Food extends Observable {
    	/** 菜名 */
    	private String name;
    	/** 菜价 */
    	private float price;
    
    	public Food(String name, float price) {
    		this.name = name;
    		this.price = price;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public float getPrice() {
    		return price;
    	}
    
    	public void setPrice(float price) {
    		this.price = price;
    		/**
    		 * 设置菜价的状态已经被改变
    		 */
    		this.setChanged();
    		/**
    		 * 通知【全部】正在看菜(已经注冊了)的顾客,然后回调Observer的update方法进行更新
    		 * 
    		 * 这里能够体现对象的一对多:一个小商贩一旦更新价格(即一个对象改变状态)。便会自己主动通知全部的顾客(依赖它的对象都会收到通知)
    		 * 并自己主动update
    		 */
    		this.notifyObservers(price);
    	}
    
    }
    
    /**
     * 顾客 --观察者
     */
    class Customer implements Observer {
    	private String name;
    
    	public Customer(String name) {
    		this.name = name;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	@Override
    	public void update(Observable o, Object arg) {
    		if (o instanceof Food && arg instanceof Float) {
    			Food food = (Food) o;
    			float price = (Float) arg;
    			System.out.println("您好:" + this.name + " ," + food.getName()
    					+ "的价格已经发生改变。如今的价格为:" + price + "元/斤");
    		}
    	}
    
    }
    
    /**
     * client測试类
     * 
     * @author Leo
     */
    public class Test {
    	public static void main(String[] args) {
    		Food food = new Food("土豆", 1.0f);
    		Customer zhangsan = new Customer("张三");
    		Customer lisi = new Customer("李四");
    		/**
    		 * 加入顾客
    		 */
    		food.addObserver(zhangsan);
    		food.addObserver(lisi);
    		/**
    		 * 更新价格
    		 */
    		food.setPrice(1.5f);
    	}
    }

    三、应用场景

    GUI框架、气象观察等


    四、小结

    在通知全部观察者之前一定要调用 setChanged()方法来设置被观察者的状态已经被改变,这样notifyObservers()才会回调Observer的update方法进行更新。

    以上内容假设有不同的见解或疏忽的地方,还请大家提出宝贵的建议或意见。

    最后大家能够试着将以下的uml模型进行详细的代码实现,如图:附源代码



    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    【原创】C# 文件操作详解(三)Directory类
    【原创】C# 文件操作详解(一)File类
    【原创】VS使用技巧——工欲善其事必先利其器
    【原创】C# 文件操作详解(四)DirectoryInfo类
    strpos用法
    调试跳转动态打印
    解决DIV超出样式长度自动换行
    PHP时间戳常用转换在(大、小月问题)
    懒人JS
    PHP 快速排序 与二维数组排序
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4822985.html
Copyright © 2011-2022 走看看