使用观察者模式进行订单管理
概念:观察者模式是由发送者和观察者构成,发送者在状态改变时,主动通知所有的观察者做相应的刷新。
观察者模式定义了对象之间一对多的依赖关系,以便一个对象状态发生改变时,所有依赖于它的对象都能够得到通知,并自动刷新。
/**
* author: Alan on 2017/12/14 15:34
* address: xk6321@gmail.com
* description: 订单管理观察者 用户对订单做了操作后,通知所有注册观察者的对象作相应的改变
*/
class OrderManageObserver {
companion object {
var list: MutableList<OrderManageListener>? = null
var instance: OrderManageObserver? = null
get() {
if (field == null) {
// 使用双重锁方式实现单例,保持只有一个实例
synchronized(OrderManageObserver::class.java) {
if (field == null){
list = ArrayList()
field = OrderManageObserver()
}
}
}
return field
}
}
/**
* 接受订单
*/
fun orderReceivingClick(orderStep: Int?) {
list?.forEach {
// 通知所有观察者
it.orderReceiving(orderStep)
}
}
/**
* 订单删除
*/
fun orderDeleteClick(orderStep: Int?) {
list?.forEach {
// 通知所有观察者
it.orderDelete(orderStep)
}
}
/**
* 注册订单监听
*/
fun setOrderClick(orderFace: OrderManageListener) {
list?.add(orderFace)
}
}
订单管理监听器
/**
* author: Alan on 2018/1/6 14:01
* address: xk6321@gmail.com
* description: 订单管理监听器
*/
interface OrderManageListener {
fun orderReceiving(orderStep: Int?) // 接受订单
fun orderDelete(orderStep: Int?) // 订单删除
}
注册观察者
OrderManageObserver.instance?.setOrderClick(object : OrderManageListener {
override fun orderReceiving(orderStep: Int?) {
// 在这里做相应操作
}
override fun orderDelete(orderStep: Int?) {
// 订单删除, 刷新列表
}
})
发送者
override fun orderDelSuccess(orderStep: Int?) {
// 在订单删除成功后,通知所有的观察者做相应的操作
OrderManageObserver.instance?.orderDeleteClick(orderStep)
}
总结:观察者模式看起来很高大上,其实说白了就是一个类维护了另一个类的一个集合,并通过这个集合绑定解绑或调用另一个类的方法,对程序的解耦有一定帮助。在这里,我只简单的实现了一下,如果项目比较大,且用的地方比较多的话,在设计底层框架的时候,可以利用多态的特性进行抽象,以便适用与各种场景。