java设计模式(十三):观察者模式

一:观察者模式

1.引出问题

  当一个系统如何去发布通知,并且及时的通知用户,通知用户并进行反馈。这里我们就引出一个新的模式:观察模式。观察者模式的结构原理图如下:

                      

2.引出概念

  从上图可以看到有以下几个概念:
  主题:又叫被观察者对象,用来发布消息

  订阅:又叫观察者,用来接收消息

 

二:代码

1.订阅抽象

package test;

/**
 * 订阅(即观察对象)
 * @author monxz
 *
 * @time  2019年7月29日
 */
public interface Observer {
	//更新
 public void update(String msg);
}

2.主题抽象

package test;


/**
 * 主题:(即被观察的对象)
 * @author monxz
 *
 * @time  2019年7月29日
 */
public interface Subject {

	//添加观察者
	public void addObserver(Observer  obs);
	
	//删除观察者
	public void removeObserver(Observer obs);
	
	//消息通知
	public void noty(String msg);
}

3.主题实现

package test;

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

/**
 * 主题的实现
 * @author monxz
 *
 * @time  2019年7月29日
 */
public class SubjectImpl implements  Subject{
	//观察者的存储集合
	private List<Observer>  obsList=new ArrayList<Observer>();
	
	

	@Override
	public void addObserver(Observer obs) {
		obsList.add(obs);
		
	}

	@Override
	public void removeObserver(Observer obs) {
		obsList.remove(obs);
		
	}

	@Override
	public void noty(String msg) {
		if(obsList != null && obsList.size() != 0) {
			obsList.forEach(o->{
				o.update(msg);
			});
		}
		
	}
	
	

}

4.订阅实现


package test;

/**
 * 观察者的实现
 * 
 * @author monxz
 *
 * @time  2019年7月29日
 */
public class User implements  Observer{
	
	private String userName;
	
	
	public String getUserName() {
		return userName;
	}


	public void setUserName(String userName) {
		this.userName = userName;
	}

	
	

	public User(String userName) {
		super();
		this.userName = userName;
	}


	@Override
	public void update(String msg) {
		System.err.println(userName+"接收到推送信息:"+msg);
		
	}

}

5.测试

package test;

public class test {

	 public static void main(String[] args) {
		Subject sb= new  SubjectImpl();
		
		User  u1=new User("u1");
		User  u2=new User("u2");
		User  u3=new User("u3");
		
		sb.addObserver(u1);
		sb.addObserver(u2);
		sb.addObserver(u3);
		sb.noty("广播总站通知:近俩天将有大暴雨!!! 时间:2019-07-30");
		
		
		
		sb.removeObserver(u2);
		sb.noty("广播总站通知:近俩天将有大暴雨!!! 时间:2019-07-31");
		
	}
}

                       

三:说明

其实在一些消息中间件中,有这样一些分组消息,实际就是过滤条件

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值