常用设计模式-观察者模式

观察者模式

观察者模式描述:

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

JDK自带观察者模式此处不做介绍, 相关链接:JDK自带观察者模式

码云地址地址:design_patterns

被观察者接口 代码片.

public interface Subject  {
	  //注册观察者
	  void register(Observer observer);
	  //移除观察者
	  void remove(Observer observer);	
	  //通知被观察者
	  void notifyObserver(Object... objs);
}

被观察者实现类代码片.

public interface AnyService  {
	void any(Object... objs);
}

public class SubjectImpl implements Subject, AnyService  {
	//观察者集合
	private final List<Observer> observers;  
	
	public SubjectImpl () {
		observers = new ArrayList<>();
	}
	
	//通知所有观察者
	@Override
	public void any(Object... objs){
		this.notifyObserver(objs);
	}
	
    @Override
    public void register(Observer observer){
    	if(!observers.contains(observer)) {
			observers.add(observer);
		}
    }
    
	@Override
	void remove(Observer observer){
		observers.remove(observer);
	}
	
	@Override
	void notifyObserver(Object... objs){
		observers.stream()
					.filter(Objects::nonNull)
					.forEach(observer-> observer.update(this, objs));
	}	
}

定义观察者接口, 采用主动拉取模式获取数据 代码片.

public interface Observer{
	void update(Subject subject, Object... objs);
}

观察者抽象类实现类 代码片.

public abstract class AbsObserver implements Observer{
	//注册观察者
	public AbsObserver (Subject subject) {
		subject.register(this);
	}
}

观察者实现类代码片.

public class ObserverImpl extends AbsObserver{
	public ObserverImpl (Subject subject){
		super(subject);
	}
	@Override
	void update(Subject subject, Object... objs){
	 		SubjectImpl SubjectImpl = (SubjectImpl)subject;
	 		System.out.printf("观察者1"+ Arrays.toString(objs))		
	}
}

观察者实现类2代码片.

public class ObserverImpl2 extends AbsObserver{
public ObserverImpl2 (Subject subject){
		super(subject);
	}
	@Override
	void update(Subject subject, Object... objs){
	 		SubjectImpl SubjectImpl = (SubjectImpl)subject;
	 		System.out.printf("观察者2"+ Arrays.toString(objs))		
	}
}

执行代码代码片

public class ObserverTest{
	public static void main(String[] args) {
		SubjectImpl subjectImpl  = new SubjectImpl(); 
		ObserverImpl observerImpl = new ObserverImpl (subjectImpl); 
		ObserverImpl2 observerImpl2 = new ObserverImpl2 (subjectImpl); 
		subjectImpl.any(args);
	}
}

本文部分定义参考了网上博文和网上信息…

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值