版权声明:除注明转载或参考的文章皆为原创,转载请注明出处。 https://blog.csdn.net/lengyoumo/article/details/80851058
介绍
网上已经有不少观察者模式的介绍了。但我视图用更简单更干的方法让你明白
使用场景
观察者模式,也叫发布订阅模式
结构
观察者模式总共分为三个部分:
1,发布者、被观察者(publisher)
发布者包含 被监听的方法,注册观察者的方法,触发观察者的反馈方法的方法
2,订阅者、观察者(observer)
用于提供触发动作
3,客户端
操作事件发布者绑定监听者,触发发布者的被监听事件
实现
功能:一只猫和一只狗,猫一叫,狗就叫。猫是发布者,狗是监听者。叫是动作。
js 版观察者模式
1,发布者
function Publisher_Cat(){
//猫的动作,也是被监听的动作
this.scream=()=>{
console.log("miao");
}
//观察者列表及其添加方法
this.observerList=[];
this.AddObserver=(observer)=>{
this.observerList.push(observer);
}
//发布者动作触发后,触发监听者的动作
this.ObserverRun=()=>{
if(this.observerList.length > 0){
foreach(let i in this.observerList){
i.Run();
}
}
}
}
2,观察者
function Observer_Dog(){
//观察者的方法
this.scream=()=>{
console.info("wang");
}
//被发布者触发的观察者方法
this.Run=()=>{
this.scream();
}
}
3,客户端
//实例化 发布者和观察者
var Cat = new Publisher_Cat();
var Dog = new Observer_Dog();
//订阅,将观察者注册到发布者
Cat.AddObserver(Dog);
//手动触发猫叫
Cat.scream();
//控制台中狗自动就跟着叫了
console:
"miao"
"wang"
C#(unity) 版观察者模式
c#实现观察者的方法有很多,可以用ArrayList 或hashtable写一个注册列表,也可以用委托或事件实现。本例使用委托+事件实现。
1,发布者
class void Publisher_Cat{
//创建委托于事件
public teleget void OnAction();
public event OnAction on_Action;
//猫的动作,也是被监听的动作
public void scream{
Debug.Log("miao");
}
//观察者列表添加方法
public void AddObserver(Observer_Dog observer){
on_Action += observer;
}
//观察者列表删除方法
public void AddObserver(Observer_Dog observer){
on_Action -= observer;
}
//发布者动作触发后,触发监听者的动作
public void ObserverRun(){
this.on_Action();
}
}
2,观察者
class Observer_Dog{
//观察者的方法
public void scream(){
Debug.Log("wang");
}
//被发布者触发的观察者方法
public void Run(){
this.scream();
}
}
3,客户端
//实例化 发布者和观察者
Publisher_Cat Cat = new Publisher_Cat();
Observer_Dog Dog = new Observer_Dog();
//订阅,将观察者注册到发布者
Cat.AddObserver(Dog);
//手动触发猫叫
Cat.scream();
//控制台中狗自动就跟着叫了
Debug.Log:
"miao"
"wang"
php版观察者模式
php需要写一个注册列表
1,发布者
class Publisher_Cat{
//猫的动作,也是被监听的动作
fucntion scream{
echo "miao";
}
//观察者列表添及加方法
var $observerList=array();
function AddObserver($observer){
$observerList.push($observer);
}
//发布者动作触发后,触发监听者的动作
function ObserverRun(){
foreach($x as this->$observerList){
$x.Run();
}
}
}
2,观察者
class Observer_Dog{
//观察者的方法
function scream(){
echo "wang";
}
//被发布者触发的观察者方法
function Run(){
this->scream();
}
}
3,客户端
//实例化 发布者和观察者
var $Cat = new Publisher_Cat();
var $Dog = new Observer_Dog();
//订阅,将观察者注册到发布者
$Cat->AddObserver($Dog);
//手动触发猫叫
$Cat->scream();
//控制台中狗自动就跟着叫了
echo:
"miao"
"wang"
python版
1,发布者
class Publisher_Cat:
//猫的动作,也是被监听的动作
def scream:
print("miao")
//观察者列表添及加方法
observerList=[]
def AddObserver(observer):
observerList.append(observer)
//发布者动作触发后,触发监听者的动作
def ObserverRun:
if observerList.cont>0:
for x in observerList :
x.Run()
}
2,观察者
class Observer_Dog:
//观察者的方法
def scream:
print("wang")
//被发布者触发的观察者方法
def Run:
scream()
3,客户端
//实例化 发布者和观察者
Cat = Publisher_Cat()
Dog = Observer_Dog()
//订阅,将观察者注册到发布者
Cat.AddObserver(Dog)
//手动触发猫叫
Cat.scream()
//控制台中狗自动就跟着叫了
print:
"miao"
"wang"
GO版
1,发布者
class Publisher_Cat:
//猫的动作,也是被监听的动作
func scream(){
fmt.Println("miao")
}
//观察者列表添及加方法
observerList=[]
func AddObserver(observer):
observerList.append(observer)
//发布者动作触发后,触发监听者的动作
func ObserverRun:
if observerList.cont>0:
for x in observerList :
x.Run()
}
2,观察者
class Observer_Dog:
//观察者的方法
def scream:
fmt.Println("wang")
//被发布者触发的观察者方法
def Run:
scream()
3,客户端
//实例化 发布者和观察者
Cat = Publisher_Cat()
Dog = Observer_Dog()
//订阅,将观察者注册到发布者
Cat.AddObserver(Dog)
//手动触发猫叫
Cat.scream()
//控制台中狗自动就跟着叫了
print:
"miao"
"wang"