设计模式-观察者模式,以及如何使用观察者来为app实现即时通讯功能

观察者模式:定义对象间一种一对多的依赖关系。使的每当一个对象状态改变,则所有依赖它的对象都会得到通知。

使用场景:微信公众号,即时通讯中的消息收发等等。

现在用一个做即时通讯的用到最主要的一部分来举例,对于消息的接收。

定义被观察者接口:

/**
 * 消息被观察者
 * @author PC
 *
 */
public interface MessageReceiver {

	/**
	 * 注册观察者
	 * @param watcher
	 */
	public void addObserver(MessageWatcher watcher);
	
	/**
	 * 移除观察者
	 * @param watcher
	 */
	public void removeObserver(MessageWatcher watcher);
	
	/**
	 * 通知所有观察者
	 */
	public void notifyObversers();
	
}
定义观察者的接口:

/**
 * 观察者接口
 * @author PC
 *
 */
public interface MessageWatcher {

	/**
	 * 用来收到改变通知
	 * @param message
	 */
	public void update(Message message);
	
}

定义消息实体:

/**
 * 消息
 * @author PC
 *
 */
public abstract class Message {

}

好了,所有的抽象架构已经写完了,因为我们要处理的是服务器端推送过来的消息,所有有一个消息抽象类。


实现一个消息接收者(一个具体被观察者,相当于一个微信公众号):

/**
 * 消息处理者
 * @author PC
 *
 */
public class MessageHandler implements MessageReceiver{
	
	private List<MessageWatcher> list = new ArrayList<MessageWatcher>();
	private Message message;

	public void addObserver(MessageWatcher watcher) {
		list.add(watcher);
	}

	public void removeObserver(MessageWatcher watcher) {
		list.remove(watcher);
	}

	public void notifyObversers() {
		for (MessageWatcher watcher : list) {
			watcher.update(message);
		}
	}

	/**
	 * 自定义方法,用来接收消息
	 * @param message
	 */
	public void hanleMessage(Message message){
		this.message = message;
		notifyObversers();
	}
}

要点:要持有一个保存观察者的集合。一般会自定义一个方法用来供其他功能调用并传入消息。

好的,现在就需要实现几个具体的观察者了,假设现在我们在微信的一个和某人聊天的页面:

/**
 * 模拟一个activity
 * @author PC
 *
 */
public class Activity {

	/**
	 * 匿名内部类
	 */
	private MessageWatcher messageWatcher = new MessageWatcher() {
		
		public void update(Message message) {
			//更新消息列表
			System.out.println("收到消息..."+message);
		}
	};

	/**
	 * 模拟onCreate方法
	 */
	public void onCreate(){
		//注册观察
		MessageHandler.getInsance().addObserver(messageWatcher);
	}
	
	/**
	 * 模拟onDestory方法
	 */
	public void onDestory(){
		//解注册
		MessageHandler.getInsance().removeObserver(messageWatcher);
	}
	
}

整个消息架构已经写完,写一个调用段的实现,在真正的app中一定是在receiver中收到服务端发来的消息,然后主动去调MessageHandler.handMessage。

/**
 * 模拟一个receiver收到消息
 * @author PC
 *
 */
public class ReceiverClient {

	public static void main(String[] args) {
		//模拟已经有一个Activity存活
		Activity activity = new Activity();
		//模拟onCreate被回调
		activity.onCreate();
		//Message也用了匿名内部类的,真是肯定有具体实现类,我这里懒得写了。
		MessageHandler.getInsance().hanleMessage(new Message() {});
		//模拟onDestory被回调
		activity.onDestory();
	}
	
}

这个时候,注册了的页面就都会收到消息:

收到消息...Observable.ReceiverClient$1@1db9742

真的,即时通讯关于消息的接收处理架构就是这样写的,如果需要些即时通讯功能的伙伴们可以现学设计模式,现去实践使用。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值