观察者模式
定义:让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能自动更新自己。
优点:降低被观察者和观察者之间的耦合度,每一个具体观察者都实现一个相同的抽象观察者接口。观察者向被观察者注册,被观察者支持广播通信。
缺点:如果有多个观察者,通知所有观察者耗时较大。
小巩公司需要设计股票行情系统,电脑,手机客户端都需要收到行情。
首先,设计客户端
public interface StockObserver {
void updatePrice(String name);
void updateCount(String name);
}
public class ComputerClient implements StockObserver {
public void updatePrice(String name) {
System.out.println(name + " 股票在电脑上的价格更新了");
}
public void updateCount(String name) {
System.out.println(name + " 股票在电脑上的买卖数量更新了");
}
}
public class PhoneClient implements StockObserver {
public void updatePrice(String name) {
System.out.println(name + " 股票在手机上的价格更新了");
}
public void updateCount(String name) {
System.out.println(name + " 股票的在手机上买卖数量更新了");
}
}
定义股票的抽象类,可以添加,删除客户端
import java.util.List;
import java.util.ArrayList;
public abstract class StockSubject {
List list = new ArrayList();
private String name;
public void changeCount() {
notifyPrice();
}
public void changePrice() {
notifyCount();
}
public void add(StockObserver stockObserver) {
list.add(stockObserver);
}
public void remove(StockObserver stockObserver) {
list.remove(stockObserver);
}
public void notifyPrice() {
for (int i = 0; i < list.size(); i++) {
StockObserver stockObserver = (StockObserver)list.get(i);
stockObserver.updatePrice(getName());
}
}
public void notifyCount() {
for (int i = 0; i < list.size(); i++) {
StockObserver stockObserver = (StockObserver)list.get(i);
stockObserver.updateCount(getName());
}
}
public String getName(){ return name; }
public void setName(String name){ this.name = name; }
}
定义具体的股票类
public class Stock extends StockSubject {
public void changeCount() {
//买卖数量改变的代码
setName("中信证券");
super.changeCount();
}
public void changePrice() {
//价格改变的代码;
setName("中信证券");
super.changePrice();
}
}
运行两个客户端
public class Client {
public static void main(String[] argv) {
Stock stock = new Stock();
stock.add(new PhoneClient());
stock.add(new ComputerClient());
stock.changePrice();
stock.changeCount();
}
}