java设计模式-观察者模式

java设计模式-观察者模式

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

观察者模式又名:发布-订阅(Publish/Subscribe)模式 也是很好理解,首先要记得观察者是表示一对多关系的。可以理解成有很多人在观察着你的一举一动,他们要听你的指令行事,你有新的动作时他们就要做出改变。

如果看成发布-订阅也很好理解,就是你发布一个文章,订阅你的人都能收到你的新动态。下面来看看类图

在这里插入图片描述

这里的subject我们把他叫做主题,下文中提到的主题都表示被观察者,observer则表示观察者。主题一有新动作,就会通知订阅他的人,告诉他们有新动态,所以主题要知道有什么人订阅他,主题对象里面要维护observer对象。

观察者对象也要知道你订阅了谁,所以观察者对象里面也要维护一个subject对象。下面来看看代码:

Observer.java

public interface Observer {
	void update();
}

Subject.java

public interface Subject {
	//增加观察者
	void attach(Observer o);
	//移除观察者
	void detach(Observer o);
	//提醒
	void notifyObservers();
}

ConcreteSubject.java

public class ConcreteSubject implements Subject{
	private List<Observer> observers =new LinkedList<>();
	private String state;
	
	public String getState() {
		return state;
	}

	public void setState(String state) {
		this.state = state;
	}

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

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

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

ConcreteObserver.java

public class ConcreteObserver implements Observer {
	private ConcreteSubject subject;
	private String name;
	public ConcreteObserver(ConcreteSubject subject,String name) {
		this.subject = subject;
		this.name = name;
		this.subject.attach(this);
	}
	@Override
	public void update() {
		System.out.println("观察者"+name+"观察到的状态是"+subject.getState());
	}
}

调用

	public static void main(String[] args) {
		ConcreteSubject subject = new ConcreteSubject();
		
		new ConcreteObserver(subject, "A");
		new ConcreteObserver(subject, "B");
		
		subject.setState("stateA");
		subject.notifyObservers();
		System.out.println("改变状态后");
		subject.setState("stateB");
		subject.notifyObservers();
	}

打印结果

观察者A观察到的状态是stateA
观察者B观察到的状态是stateA
改变状态后
观察者A观察到的状态是stateB
观察者B观察到的状态是stateB

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值