java Observer模式 重构 Duplicate Observed Data

    今天再看《重构》这本书,8.6这一篇:Duplicate Observed Data ,讲述可以使用类似观察者模式的方法,将处理用户界面的处理业务逻辑的代码分开,形如MVC模式;

    观察者模式就相当于使用观察者一直注意着view层的数据变化,如果变化,就需要使用Controller层进行业务处理,隔离了view--Controller;

    在spring中,类似 Spring事件处理 的方法,也可以理解为 观察者模式:

        ◆定义Event类,继承org.springframework.context.ApplicationEvent。
        ◆编写发布事件类Publisher,实现org.springframework.context.ApplicationContextAware接口。
        ◆覆盖方法setApplicationContext(ApplicationContext applicationContext)和发布方法publish(Object obj)。
        ◆定义时间监听类EventListener,实现ApplicationListener接口,实现方法onApplicationEvent(ApplicationEvent event)。

    关于 Spring事件处理的方法并不在此文章中过多描述。

   

    下面写一个在电商系统中很经常遇到的例子,如果商品价格发生了变化,那么将此商品价格变化的事件通知给对应的会员, 形如 降价通知 的简单实现:

    代码分为三个部分,商品类;顾客类;测试类;

    

package observer;

import java.util.Observable;

public class Good extends Observable {
	private String name;
	private float price;

	public Good(String name, float price) {
		this.name = name;
		this.price = price;
	}

	public String getName() {
		return name;
	}

	public float getPrice() {
		this.notifyObservers(price);
		return price;
	}

	public void setPrice(float price) {
		this.price = price;
		/*
		 * 注意 :在通知 所有观察者之前 一定要调用 setChanged()方法来设置被观察者的状态已经被改变,
		 */
		this.setChanged();
		/*
		 * notifyObservers 方法在通知完所有吗 观察者 后, 会自动调用 clearChanged 方法来清除 被观察者 的状态改变。
		 */
		this.notifyObservers(price);
	}
}



package observer;

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

public class Customer implements Observer {
	private String name;

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

	public String getName() {
		return name;
	}

	public void update(Observable observable, Object arg) {
		if (observable instanceof Good && arg instanceof Float) {
			System.out.println("VIP客户<" + this.name + ">您好 : "
					+ ((Good) observable).getName() + "的价格变了," + arg + "元了 !");
		}
	}
}



package observer;

public class Test {
	public static void main(String[] args) {
		Good good = new Good("商品A", 1.0f);
		
		Customer alexgaoyh_1 = new Customer("alexgaoyh_1");
		Customer alexgaoyh_2 = new Customer("alexgaoyh_2");
		
		good.addObserver(alexgaoyh_1);
		good.addObserver(alexgaoyh_2);
		
		good.setPrice(10.0f);
		good.setPrice(30.0f);
	}
}
以上三处代码的简单实现,实现了当商品价格发生变化的话,会及时通知给对应的顾客。



被观察者类: 

extends java.util.Observable

    调用

void addObserver(Observer o)
当被观察事件发生时,执行:

setChanged();
notifyObservers();



setChange() 方法用来设置一个内部标志位注明数据发生了变化; notifyObservers() 方法会去调用观察者对象列表中所有的 Observer update() 方法,通知它们数据发生了变化。
只有在 setChange() 被调用后, notifyObservers() 才会去调用 update()


观察者类:

implements java.util.Observer
实现 Observer 接口的唯一方法 update

void update(Observable o, Object arg)
形参 Object arg ,对应一个由 notifyObservers(Object arg); 传递来的参数,当执行的是 notifyObservers(); 时, arg null






你可能感兴趣的:(java,observer,Observable,observer模式)