设计模式的应用场景(14)--观察者模式

观察者模式

定义:让多个观察者对象同时监听某一个主题对象,这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能自动更新自己。

优点:降低被观察者和观察者之间的耦合度,每一个具体观察者都实现一个相同的抽象观察者接口。观察者向被观察者注册,被观察者支持广播通信。

缺点:如果有多个观察者,通知所有观察者耗时较大。

小巩公司需要设计股票行情系统,电脑,手机客户端都需要收到行情。
首先,设计客户端

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();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值