• [JavaScrip和C#两种语言]实现观察者模式


    实现观察者模式的过程

    实现观察者模式有很多形式,比较直观的一种是使用一种“注册——通知——撤销注册”的形式。下面的三个图详细的描述了这样一种过程:

    1、观察者

    (Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。

    2、被观察对象

    被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。

    3、撤销观察

    观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。   观察者将自己注册到被观察者的容器中时,被观察者不应该过问观察者的具体类型,而是应该使用观 察者的接口。这样的优点是:假定程序中还有别的观察者,那么只要这个观察者也是相同的接口实现即可。一个被观察者可以对应多个观察者,当被观察者发生变化 的时候,他可以将消息一一通知给所有的观察者。基于接口,而不是具体的实现——这一点为程序提供了更大的灵活性。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head>
    <title>Untitled Page</title>
    <script type="text/javascript">
    var Observer=function (){
    this.Response=function(){
    document.writeln(
    this.name+"跑了;");
    }
    }
    var Subject=function (){
    this.list=new Array();
    this.Aimat=function(obs){
    this.list.push(obs);

    }
    }
    var Mouse=function (name,sub){
    Observer.call(
    this);
    this.name=name;
    sub.Aimat(
    this);
    }
    var Cat=function (){
    Subject.call(
    this);
    this.cry=function(){
    for(var i=0;i<this.list.length;i++)
    {
    this.list[i].Response();
    }
    }
    }
    function test()
    {
    var cat=new Cat();
    var mouse1=new Mouse("老鼠1",cat);
    var mouse2=new Mouse("老鼠2",cat);
    cat.cry();
    }


    </script>
    </head>
    <body>
    <input type="button" value="测试" onclick="test()" />
    </body>
    </html>

    C#实现,为方便扩展,添加了一个事件。

    public interface Observer
    {
    void Response();//观察者的响应
    }
    public interface Subject
    {
    void AimAt(Observer obs);//针对哪些观察者
    }
    public delegate void delResponse();
    public class Mouse : Observer
    {
    private string name;
    public Mouse(string name, Subject subj)
    {
    this.name = name;
    subj.AimAt(
    this);
    }
    public event delResponse OnResponse;
    public void Response()
    {
    if (OnResponse == null)
    {
    Console.WriteLine(name
    + ":跑了");
    }
    else
    {
    OnResponse();
    }
    }
    }
    public class Cat : Subject
    {
    private List<Observer> observers;
    public Cat()
    {
    this.observers = new List<Observer>();
    }
    public void AimAt(Observer obs)
    {
    this.observers.Add(obs);
    }
    public void Cry()
    {
    Console.WriteLine(
    "Cat 叫了!");
    foreach (Observer obs in this.observers)
    {

    obs.Response();
    }
    }
    }

  • 相关阅读:
    python 正则
    python qrcode二维码生成与识别
    python 轮询,长轮询
    Python随心记--module模块和包
    PHP-AOP简介
    PHP三层结构(下)——PHP实现AOP
    PHP三层结构(上)——简单三层结构
    PHP--翻牌活动(概率中奖..............)
    MySQL(表锁)、PHP(文件锁)锁机制及应用场景
    TP5一对一、一对多关联模型的使用
  • 原文地址:https://www.cnblogs.com/qingyi/p/1965777.html
Copyright © 2020-2023  润新知