观察者模式
观察者模式:能够在数据变更或某时间发生时,触发变更通知给观察者。观察者是接收事件和通知的那一方。。
观察者模式:允许一个实例类型,在数据变更事件发生时,“发布”事件到另外一个类型的实例(观察者)。让观察者能够得到这个“通知”,然后去执行具体的后续处理。 存在两个对象:被观察者,观察者。被观察者发送通知,观察者接收通知,然后进行处理。
在长运行事件的应用例如web应用: 能够保持住一个”收集”触发事件的观察者。用于处理收集到的触发事件。
实现方式不同,但制定的接口可以作为运用的参考标准。
type Events strut{
//定一个事件,具体实现的类型,需要看具体的应用情况。
Data string
}
type observer interface{
//针对发现者,必须提供一个接收通知的通道(函数)。以此来接收事件或通知。
OnNotify(Event)
}
//通知器,用来注册发现者,消除发现者,通知消息。
type Notify interface{
//注册发现者,
Register(observer)
//移除发现者
DelRegister(observer)
//发送通知
Notifiy(Event)
}
小结:
观察者的模式的运用场景:就是在事件发生时,能够将这些通知发送给观察者,支持多个观察者。以上的示例中,仅具体里接口的定义,但能够作为一个标准来提供不同应用的借鉴使用。
策略行为
strategy behavioral。策略行为模式支持在运行时,选择具体的算法来实现,支持多个算法。
定义了算法的封装,并且能够在运行的时候,进行切换。
//定义算法的实际操作者接口。每一种算法的实际执行都需要实现接口。
type Operator interface{
Apply(int,int)int
}
//定义一个策略器,策略器能够接收一个实际的操作者。操作的具体函数。并且操作器需要一个方法,就是用来执行策略器的操作动作。然后在动作内部再去实际的调用,实际操作者提供的方法。
type Operation interface{
//策略器,必须能够接收一个实际的操作者。
Operator Operator
//当然也可以多定义几个策略器额外需要的参数,
name string
}
func(op *Operation)Operator(value1,value2 int){
//在策略器当中可以预先执行一些额外的动作。
dosometing
//利用实际的操作者,具体的算法器。
return op.Operator.Apply(value1,value2)
}
//--------使用策略器------
type Addition struct {
func(Addition)Apply(v1,v2)int{
return v1+v2
}
app := Operation{Addition}
app.Operator(1,2) //3
小结:
观察者模式,是用来接收事件和通知,以此来触发我们的观察者去接收到通知。并且接收到这些通知之后,去做对应的动作。当然这种通知的机制,在golang当中是可以使用channel来作为通通知通道使用的。但同样是可以把这个往chan发送消息但动作封装成为模式当中但Notificaly方法。
策略行为模式:是允许在具体运行的时候,才把具体的策略器传递进来,然后使用这个具体的操作者(算法器)来完成实际的工作。并且此时策略器,对外暴露一个属于策略器的方法。外部操作的时候,就使用这个策略器方法。 而策略器方法是可以和实际操作者(算法器)中的方法名,是不一样的。