观察者模式

爱⌒轻易说出口 提交于 2019-12-02 14:38:20

观察者抽象类:Observer.java
观察者具体实现类1:StockObserver.java
观察者具体实现类2:NBAObserver.java
被观察者抽象类:Subject.java
被观察者具体实现类:Secretary.java
测试类:Client.java

  • 被观察者维护有观察者的一份列表,当被观察者的状态发生变化时,遍历观察者列表以通知他们

Observer.java

package com.pattern.test.observer;

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

	public abstract void update();
}

StockObserver.java

package com.pattern.test.observer;

public class StockObserver extends Observer{

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

	@Override
	public void update() {
		System.out.println(subjet.subjectState + " " + name + "别看股票了");
	}

}

NBAObserver.java

package com.pattern.test.observer;

public class NBAObserver extends Observer{

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

	@Override
	public void update() {
		System.out.println(subjet.subjectState + " " + name + "别看NBA了");
	}

}

Subject.java

package com.pattern.test.observer;

import java.util.ArrayList;
import java.util.List;

public abstract class Subject {
	
	protected List<Observer> observers = new ArrayList<Observer>();

	protected String subjectState;
	
	public abstract void attach(Observer observer);

	public abstract void detach(Observer observer);
	
	public abstract void notice();

}

Secretary.java

package com.pattern.test.observer;

public class Secretary extends Subject {

	@Override
	public void attach(Observer observer) {
		observers.add(observer);
	}

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

	@Override
	public void notice() {
		for (Observer observer : observers) {
			observer.update();
		}
	}

}

Client.java

package com.pattern.test.observer;

public class Client {

	public static void main(String[] args) {
		
		Secretary secretary = new Secretary();
		
		StockObserver stockObserver = new StockObserver("张三", secretary);
		NBAObserver nbaObserver = new NBAObserver("李四", secretary);
		secretary.attach(stockObserver);
		secretary.attach(nbaObserver);
		
		secretary.subjectState = "老板回来";
		
		secretary.notice();
	}
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!