设计模式之观察者模式

定义

 发布订阅模式。在对象之间定义了一对多的依赖,当一个对象发生改变,依赖它的对象都会收到通知并自动更新

构成部分

  • 抽象被观察角色

    一个抽象主题,它把所有对观察者对象的引用保存到一个集合中,每一个主题都可以包含任意数量的观察者。抽象主题提供了一个接口,可以增加和删除观察者角色
    
  • 具体被观察者角色

     具体的主题,当内部状态改变时,会向所有的观察者发出通知
    
  • 抽象观察者角色

    为具体观察者提供接口,在接收到被观察者的通知后更新自己
    
  • 具体观察者角色

    实现观察者角色的接口
    

使用场景

  • 微信公众号服务,不定时发布一些消息,关注公众号的就可以收到推送消息,取消关注就收不到推送消息

代码实例

抽象观察者角色

	/**
	 * 抽象观察者角色
	 */
	interface AbsObserver {
	
	
	
	    fun  update(data:Any)
	}

具体观察者角色

	import android.util.Log
	
	/**
	 * 具体观察者角色
	 */
	class Observer : AbsObserver {
	
	    private val TAG="Observer"
	
	    /**观察者的名字*/
	    private var name:String=""
	
	    constructor(name: String) {
	        this.name = name
	    }
	
	
	    /**
	     * 观察者接收到被观察者的消息
	     */
	    override fun update(data: Any) {
	        Log.i(TAG,"微信订阅者${name}接收到消息:"+data)
	    }
	}

抽象被观察者角色

	/**
	 * 抽象被观察者角色
	 */
	interface AbsObservable {
	
	
	    /**
	     * 添加观察者
	     */
	    fun addObserver(observer:AbsObserver)
	
	
	    /**
	     * 移除观察者
	     */
	    fun removeObserver(observer:AbsObserver)
	
	
	    /**
	     * 发送通知
	     */
	    fun notify(data:String)
	}

具体被观察者角色

	import android.util.Log
	import java.util.*
	
	/**
	 * 具体观察者角色
	 */
	class Observable:AbsObservable {
	
	
	    private val TAG="Observable"
	
	    /**观察者集合*/
	    private val mObservers:Vector<AbsObserver> = Vector()
	
	    init {
	        Log.i(TAG,"微信号被创建")
	
	    }
	
	    override fun addObserver(observer: AbsObserver) {
	         if(!mObservers.contains(observer)){
	             mObservers.add(observer)
	         }
	        Log.i(TAG,"微信观众订阅了微信号:"+observer)
	    }
	
	    override fun removeObserver(observer: AbsObserver) {
	        mObservers?.remove(observer)
	        Log.i(TAG,"微信观众取消微信号的订阅:"+observer)
	
	    }
	
	
	    override fun notify(data: String) {
	        Log.i(TAG,"被观察者发生了该改变,发送通知给观察者:"+data)
	        mObservers?.forEach {
	            it.update(data)
	        }
	
	    }
	
	
	
	}

测试代码

		    /**
		     * 观察者模式测试
		     */
		    fun   observeMode(){
		
		        //微信公众号(被观察者对象)
		        val server= Observable()
		
		        //订阅对象(观察者对象)
		        server.addObserver(Observer("张三"))
		        server.addObserver(Observer("王石"))
		        server.addObserver(Observer("张龙"))
		
		
		        //微信公众号发布消息
		        //发布的消息内容
		        val message="微信公众号发布消息了..."
		        server.notify(message)
		
		    }

打印信息

 Observable: 微信号被创建
 Observable: 微信观众订阅了微信号:com.mj.rxjavasample.observeMode.Observer@419b8340
 Observable: 微信观众订阅了微信号:com.mj.rxjavasample.observeMode.Observer@419b8820
 Observable: 微信观众订阅了微信号:com.mj.rxjavasample.observeMode.Observer@419b8b20
 Observable: 被观察者发生了该改变,发送通知给观察者:微信公众号发布消息了...
 Observer: 微信订阅者张三接收到消息:微信公众号发布消息了...
 Observer: 微信订阅者王石接收到消息:微信公众号发布消息了...
 Observer: 微信订阅者张龙接收到消息:微信公众号发布消息了...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值