zoukankan      html  css  js  c++  java
  • 观察者模式C#实现实例(二)

    接着上一次的话题继续。

    上一篇中讲了实现思路,这篇中就直接上代码了

      定义的目标接口——Isub,具体实现如下:

      

    1  public interface Isub
    2     {
    3         void addobser(Iobse obe);
    4         void removeobser(Iobse ove);
    5         void notify();
    6     }

      定义的观察者接口——Iobse,具体实现如下:

      

    1 public interface Iobse
    2     {
    3         void update(float times);
    4     }

    定义实现目标接口的目标类——clock,具体实现如下:

     1 public class clock : Isub
     2     {
     3         private float times;
     4         List<Iobse> obse=new List<Iobse>() ;
     5 
     6         public float Times
     7         {
     8             get
     9             {
    10                 return times;
    11             }
    12 
    13             set
    14             {
    15                 times = value;
    16             }
    17         }
    18 
    19         public void addobser(Iobse obe)
    20         {
    21             obse.Add(obe);
    22         }
    23 
    24         public void notify()
    25         {
    26             for(int i = 0; i < obse.Count(); i++)                  
    27             {
    28                 Iobse Iose = (Iobse)obse[i];
    29                 Iose.update(Times);
    30             }
    31         }
    32 
    33         public void removeobser(Iobse ove)
    34         {
    35             obse.Remove(ove);
    36         }
    37     }

    这里要说明的是,具体目标类除了要实现接口内的方法外,还要定义我们所关心的数据,这里是times。

     

    接下来是实现观察者A和观察者B了,具体代码如下:

    对于A有:

      

     1 public class A : Iobse
     2     {
     3         private float times;
     4         private clock c2 = new clock();
     5         public A(clock c2)
     6         {
     7             this.c2 = c2;
     8             c2.addobser(this);
     9         }
    10         public void update(float times)
    11         {
    12             this.times = times;
    13             if (times > 9 * 60)                    //这里是我们对所关心的数据times所作出的一个反映——打印出一条信息
    14             {
    15                 MessageBox.Show("已经9点,可以起床了");
    16             }
    17         }
    18     }

    对于B,有:

     1  public class B : Iobse
     2     {
     3         private float times;
     4         private clock c1 = new clock();
     5         public B(clock c1)
     6         {
     7             this.c1 = c1;
     8             c1.addobser(this);
     9         }
    10             
    11                 
    12             
    13         public void update(float times)
    14         {
    15             this.times = times;
    16             if (times > 9 * 60 + 30)
    17             {
    18                 MessageBox.Show("已经超过9点半了,上班要迟到了");
    19             }
    20         }
    21     }

    最后一步,展示结果。

      在这里我在WPF的MainWindow上定义了一个Button,并新建一个单击事件用来展示结果。代码如下:

    1  private void button_Click(object sender, RoutedEventArgs e)
    2         {
    3             clock c1 = new clock();
    4             c1.Times = 9 * 60 + 2;
    5             A a = new A(c1);
    6             B b = new B(c1);
    7             c1.notify();
    8         }

    不出意外的话,将会弹出Messagebox。

    不足之处,这里的代码非常简陋,并没有加保护,但是这也是为了表意清晰,我们可以在方法的内部做一些封装保护,而不是这样“裸奔”,当然这个实例只是做交流学习使用。

    关于后续拓展,当我们建立完clock类,A类,B类之后我们还可以添加一个观察者C类,那么如果添加一个C类,并对时间大于10点(这里用10*60的数字表示就好)作出反映(例如执行一个动作eat()),该怎么做?有没有思路?有没有实现?

      

  • 相关阅读:
    ASP.NET Post方式提交
    MVC增加操作日志
    asp.net MVC 下拉多级联动及编辑
    redis基本数据类型之String
    关于idea下使用springinitializr创建项目时 初始化失败的解决
    Failed to read artifact descriptor for org.mybatis:mybatis:jar:2.2.1
    如何查看日志文件
    nginx 部署vue 以及同一端口下部署监听多个vue 项目
    JsonView 与JsonIgnore 使用
    vue 打包部署
  • 原文地址:https://www.cnblogs.com/leelds/p/6832318.html
Copyright © 2011-2022 走看看