C#观察者模式的实现的一点理解。

来源:互联网 发布:南京江宁麒麟网络问政 编辑:程序博客网 时间:2024/04/25 18:02

今天研究了一下c#观察者模式的实现。

我的理解那  不多说了,直接贴代码

代码如下 

using System;using System.Data;using System.Text;using System.Collections;using System.Collections.Generic;namespace  myStu{/*cicnor   2012-01-01    本章学习一下c#的观察者模式。   实现的类包括, 老子,儿子   房地产商。   房地产商 通知老子,你们家补偿1000万 。 老子把钱分给了大儿子400万 ,分给了二儿子400万   大儿子拿钱买了一套房,二儿子用钱投资开了一家商店。   *//*实际学习中碰到的问题1 构造器的继承  ??*//*用到的知识点:多态的实现 观察者模式的实现封装 : 比如 存款,和名字,我不想被其他人知道,但是有些人是可以知道的,但是他们要通过一定的途径财经知道。继承 :是为了代码公用,比如 构造器,名称,存款的操作,这些都是一样的,所以可以用继承多态 : 老子有钱了,儿子有钱了,他们的行为是不一样的,但是都是有钱了的动作,这个就叫做多态。本例子是通过重写虚函数来实现的。观察者模式 :老子开始分钱了,那么我就要告诉儿子,我要分钱给你们了, 有一个疑问 : 儿子接受通知的这个事件名称是不是必须是相同的。不然老子怎么知道通过什么途径来让儿子知道了啊1  方法名称要一样?2  使用委托 ?3 观察者的对象不一样,那么除了泛型 ,还有其他的实现方法吗?*//*有时间把上边几个疑问研究一下!*/class programe{   static void Main(string[] arg){try{                fathClass obj = new fathClass("老子") ;obj.addobserver(new firstsonClass("大儿子"))  ;obj.addobserver(new secsonClass("小儿子"))  ;obj.income(10000) ;obj.actionOfgetMoney() ;}catch (Exception err){Console.WriteLine(err.Message);}}}//老子类,有钱了,我就分给我儿子钱。    class fathClass    {public fathClass(){}private string name ;public string GetName(){return name ;}public fathClass(string flag){name = flag ;}private IList<fathClass> objs = new List<fathClass>() ;public  void addobserver(fathClass obj){objs.Add(obj) ;Console.WriteLine(name +"我有儿子了 他的名字是:"+obj.GetName()) ;}public  void removeobserver(fathClass obj){objs.Add(obj) ;Console.WriteLine(name +"我减少一个人") ;}private double disposit ; //存款金额//收入public void income(double value){if (value <=0){Console.WriteLine(name +"你是一个骗子,我的收入能是负数吗!") ;}this.disposit = this.disposit + value ;Console.WriteLine(name +"我收入了" + value.ToString()) ;Console.WriteLine(name +"我的存款还有" + disposit.ToString()) ;}//支出public void pay(double value){if (value <=0){Console.WriteLine(name +"兄弟 你傻了,我支付负数是啥意思啊!") ;}if(this.disposit <value){Console.WriteLine(name +"兄弟 啥意思啊,你让我欠债啊") ;}this.disposit = this.disposit - value ;Console.WriteLine(name +"我支出了" + value.ToString()) ;Console.WriteLine(name +"我的存款还有" + disposit.ToString()) ;}        virtual public void actionOfgetMoney(){if(objs.Count == 0){Console.WriteLine(name +"老来无子 ,要钱有啥用!") ;return ;}  else{Console.WriteLine(name + "我有" +objs.Count.ToString()+"个儿子,我要把我的钱分给他们") ;}pay(10000) ;foreach(fathClass obj in objs ){obj.income(10000) ;obj.actionOfgetMoney() ;}    }    }//儿子类,同时也是一个观察者 sealed class firstsonClass: fathClass    {public firstsonClass(string flag):base( flag){}        override public void actionOfgetMoney(){Console.WriteLine(this.GetName()+"我有钱,我要投资建立商铺");}    }//儿子类,同时也是一个观察者 sealed class secsonClass: fathClass    {public secsonClass(string flag):base( flag){}        override public void actionOfgetMoney(){Console.WriteLine(base.GetName() +"我有钱,我要买一套住房");}    }}

运行结果如下

---------- run ----------=============== 运行C#程序 Write By cicnor===============老子我有儿子了 他的名字是:大儿子老子我有儿子了 他的名字是:小儿子老子我收入了10000老子我的存款还有10000老子我有2个儿子,我要把我的钱分给他们老子我支出了10000老子我的存款还有0大儿子我收入了10000大儿子我的存款还有10000大儿子我有钱,我要投资建立商铺小儿子我收入了10000小儿子我的存款还有10000小儿子我有钱,我要买一套住房=============== 程序结束 Copy cicnor 2001===============Output completed (0 sec consumed) - Normal Termination


原创粉丝点击