Java观察者模式

优点:

  • 观察者和被观察者之间是抽象耦合
  • 建立一套触发机制

缺点:

  • 运行效率低
  • 如果在观察者和观察目标之间存在循环依赖,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
  • 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

角色:

  • Subject被观察者
  • Observer观察者
  • ConceteSubject具体被观察者
  • ConcreteObserver具体的观察者

Subject被观察者

package com.memory.observer;

 
import java.util.Vector;

/**
 * 被观察者
 * 
 * @author Administrator
 *
 */
public abstract class Subject {
	/**
	 * 存储集合 ,线程安全
	 */
	private Vector<Observer> obsVector = new Vector<>();
	public void addObserVer(Observer o){
		System.out.println("加入观察者列表");
		this.obsVector.add(o);
	}
	public void delObserVer(Observer o){
		System.out.println("移除观察者列表");
		this.obsVector.remove(o);
	}
	public void notifyObservers(){
		System.out.println("触发观察者模式");
		for(Observer o:obsVector){
			o.update();
		}
	}
}

ConceteSubject具体被观察者

package com.memory.observer;

/**
 * 具体被观察者
 * 
 * @author Administrator
 *
 */
public  class ConcreteSubject  extends Subject{
	/**
	 * 具体业务
	 */
	 public void onWork(){
		 super.notifyObservers();
	 }
}

Observer观察者

package com.memory.observer;

/**
 * 观察者
 * 
 * @author Administrator
 *
 */
public interface Observer {
	/**
	 * 更新方法
	 */
	public void update();
}

ConcreteObserver具体的观察者

package com.memory.observer;

/**
 * 具体观察者
 * 
 * @author Administrator
 *
 */
public class ConcreteObserver implements Observer {

	/**
	 * 实现更新方法
	 */
	@Override
	public void update() {
		// TODO Auto-generated method stub
		System.out.println("接收到消息,并处理");
	}
 
}

测试

//创建一个被观察者
		ConcreteSubject subject = new ConcreteSubject();
		//定义一个观察者
		Observer observer = new ConcreteObserver();
		//观察者观察被观察者
		subject.addObserVer(observer);
		//观察者开始工作了
		subject.onWork();

//输出结果

启动应用成功!开启美好的一天
加入观察者列表
触发观察者模式
接收到消息,并处理

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值