用js、c#(unity)、php、python、go分别实现设计模式 之 观察者模式(发布订阅模式)

版权声明:除注明转载或参考的文章皆为原创,转载请注明出处。 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"

猜你喜欢

转载自blog.csdn.net/lengyoumo/article/details/80851058