JAVA设计模式之观察者模式

观察者模式的定义:在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新

类似于发布订阅,订阅了主题对象的改动信息,自己则受到通知并作出自己的应对

原理图:

具体实现:

定义观察者接口:观察者定义一个收到被观察对象改变时调用的方法

package pers.ly.learn.designModel.observer;

public interface IObserver {
	
	public void change(String info);

}

定义观察者实现类:

package pers.ly.learn.designModel.observer;

public class Observer implements IObserver {
	
	private String name;

	public Observer(String name) {
		super();
		this.name = name;
	}

	@Override
	public void change(String info) {
		System.out.println("观察者:" + this.name +"收到Subject改动信息:" + info +" 正在做出应对...");
	}

}

定义一个主题接口:该主题支持新增观察者,删除观察者,和通知观察者三个方法

package pers.ly.learn.designModel.observer;

public interface ISubject {
	
	void addObserver(IObserver obsr);
	
	void removeObserver(IObserver obsr);
	
	void notifyObserver();

}

定义主题接口实现类:该实现类中定义observers 集合保存观察者/删除对象,调用观察者change方法则可通知观察者,info则是通知观察者的消息

package pers.ly.learn.designModel.observer;

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

public class Subject implements ISubject {
	
	private List<IObserver> observers = new ArrayList<IObserver>();
	
	private String info;

	@Override
	public void addObserver(IObserver obsr) {
		observers.add(obsr);
	}

	@Override
	public void removeObserver(IObserver obsr) {
		if(observers.contains(obsr)) {
			observers.remove(obsr);
		}
	}

	@Override
	public void notifyObserver() {
		
		if(!observers.isEmpty() && observers.size()>0) {
			for (IObserver iObserver : observers) {
				iObserver.change(info);
			}
		}
	}
	
	public void change(String info) {
		this.info = info;
		System.out.println("Subject对象change方法被调用:" + info);
		notifyObserver();
	}

}

测试代码:

package pers.ly.learn.designModel.observer;

public class Test {
	
	public static void main(String[] args) {
		
		Observer o1 = new Observer("O1");
		Observer o2 = new Observer("O2");
		Observer o3 = new Observer("O3");
		
		Subject su =new Subject();
		su.addObserver(o1);
		su.addObserver(o2);
		su.addObserver(o3);
		
		su.change("今晚加班!");
		su.removeObserver(o3);
		su.change("明晚不加班!");
		
	}
	

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值