观察者模式1.3_大话设计模式学习笔记14

小菜写的第三份代码

1、抽象通知者接口

在小菜给出的第二份代码中,既然有抽象的观察者,就应该有对应的抽象通知者。


public interface Subject {
	void Attach(Observer observer);  // 增加
	void Detach(Observer observer);  // 减少
	void Notify();   // 通知同事
	void SubjectState(String value);  // 修改前台状况消息
	String SubjectState();   // 发出前台状态消息
}

2、具体的通知类

代码内容与第二份代码中前台秘书类内容类似


public class Boss implements Subject {

	private List<Observer> observers = 
			new ArrayList<Observer>();
	private String action;
	
	@Override
	public void Attach(Observer observer) {
		observers.add(observer);
	}

	@Override
	public void Detach(Observer observer) {
		observers.remove(observer);
	}

	@Override
	public void Notify() {
		for(Observer o : observers) {
			o.Update();
		}
	}

	@Override
	public void SubjectState(String value) {
		this.action = value;
	}

	@Override
	public String SubjectState() {
		return this.action;
	}

}

3、抽象观察者

属性:

  • 1、String的name,不变
  • 2、Subject的sub,这个是抽象通知者类在这份代码修改的部分。
    原来是“前台”,现在改为抽象通知者。
    只有将其设置为抽象类型才能实现泛指,而不是具体通知者那样的单一情况。

方法:

  • 1、不变,依旧是抽象的Update(),待到子类里重写。

public abstract class Observer {
	
	protected String name;
	protected Subject sub;
	
	public Observer(String name, Subject sub) {
		this.name = name;
		this.sub = sub;
	}

	public abstract void Update();
} 

4、具体观察者

这个修改的内容一样,将前台改为抽象通知者


public class StockObserver extends Observer {

	public StockObserver(String name, Subject sub) {
		super(name, sub);
	}

	@Override
	public void Update() {
		System.out.println(sub.SubjectState() + name +
				" 关闭股票行情,继续工作!");
	}

}


public class NBAObserver extends Observer {

	public NBAObserver(String name, Subject sub) {
		super(name, sub);
	}

	@Override
	public void Update() {
		System.out.println(sub.SubjectState() + name +
				" 关闭NBA直播,继续工作!");
	}

}

5、客户端代码

public class Observer3Demo {

	public static void main(String[] args) {
		Boss huhansan = new Boss();
		
		StockObserver tongshi1 = new StockObserver("大鸟", huhansan);
		NBAObserver tongshi2 = new NBAObserver("小菜", huhansan);
		
		huhansan.Attach(tongshi1);
		huhansan.Attach(tongshi2);
		
		huhansan.Detach(tongshi1);
		
		huhansan.SubjectState("我胡汉三又回来了!");
		
		huhansan.Notify();
	}

}

6、输出结果

我胡汉三又回来了!小菜 关闭NBA直播,继续工作!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的clz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值