接着上一次的话题继续。
上一篇中讲了实现思路,这篇中就直接上代码了
定义的目标接口——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()),该怎么做?有没有思路?有没有实现?
时间: 2024-10-13 03:28:08