设计模式----观察者模式(Observer Pattern)例题

    观察者模式:定义对象之间一对多依赖关系,当被依赖对象的状态转变时,所有依赖对象能收到通知和更新自己。   

    应用场景:(1)当一个对象改变时,需要改变其他对象,但并不了解其他对象的数量。

                      (2)当一个对象应当负责通知其他对象的职责实现时,降低通知对象和被通知对象的耦合。

    缺点:被观察者对象的状态更新可能会引起观察者级联更新。   

    结构图:

设计模式----观察者模式(Observer Pattern)例题_第1张图片                                                            图片来源:《大话设计模式》 程杰

     emmm直接放类图和代码啦!

设计模式----观察者模式(Observer Pattern)例题_第2张图片                                                            图片来源:《大话设计模式》 程杰

    (1)Observer(观察者类):

package 观察者模式;

public abstract class Observer {
	public abstract void Update();
}

    (2)ConcreteObserver(具体观察者类):

package 观察者模式;

public class ConcreteObserver extends Observer{
	private String name;
	private String observerState;
	private ConcreteSubject subject;
	public ConcreteObserver(ConcreteSubject subject,String name) {
		this.subject = subject;
		this.name = name;
	}
	public void Update() {
		observerState = subject.getState();
		System.out.println("观察者"+name+"的状态更新为:"+observerState);
	}
}

    (3)Subject(被观察者类):

package 观察者模式;

import java.util.ArrayList;

public abstract class Subject {
	private ArrayList observers = new ArrayList();
	public void Attach(Observer o) {
		observers.add(o);
	}
	public void Detach(Observer o) {
		observers.remove(o);
	}
	public void Notify() {
		for(int i=0;i

    (4)ConcreteSubject(具体被观察者类):

package 观察者模式;

public class ConcreteSubject extends Subject{
	private String subjectState;
	
	public String getState() {
		return this.subjectState;
	}
	public void setState(String s) {
		this.subjectState = s;
	}
}

    (5)客户端调用:

package 观察者模式;

public class Main {

	public static void main(String[] args) {
		ConcreteSubject s = new ConcreteSubject();
		
		s.Attach(new ConcreteObserver(s,"X"));
		s.Attach(new ConcreteObserver(s,"Y"));
		s.Attach(new ConcreteObserver(s,"Z"));
		
		s.setState("睡觉了");
		s.Notify();
	}

}

 

你可能感兴趣的:(设计模式----观察者模式(Observer Pattern)例题)