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

今天研究了一下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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值