登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

学无止境

一点积累,与大家分享

 
 
 

日志

 
 

在谈观察者模式--上班玩游戏,老总是怎么知道的呢?  

2009-12-08 10:25:44|  分类: 其它 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |



----面向对象设计模式[观察者模式]
 
T:“说实话,我不做程序好多天,可我还是难忘曾经的那些天!听到你说面这样说,我到是对这个软件设计方案有点兴趣了,你能不能说详细点来听听?”
M:“行啊,难得你有这份兴趣,我就用个示例来给你简单的介绍下吧!”
T:“话说多个朋友多条路,呵呵,多个同学还多个聊天吹牛的,嘘--小点声,别让那家伙听到了。”
 
M:“其实无论你是在使用.NET还是java开发,这两个平台的事件模型就是一个典型的观察者模式的体现。我就以.NET平台的C#语言来做个简单示例介绍。”
M:“首先,我们需要定义一个委托,通过委托将两个类的交互进行了绑定,当员工玩游戏的方法PalyGame()调用后,触发委托类型的PlayGame事件,而该事件将被委托给老总(admin)的呼叫老总(Notify)方法处理。”
 
/// <summary>
/// 定义委托
/// </summary>
public delegate void DelegateMonitorEmployee(object sender, CustomeEvetnArgs e);
 
M:“你是一个人,用面向对象的思想来说的话,那么你就是一个对象吧?抽象的人类对象,在公司里,你作为一名员工,那我们就计算机语言来抽象出 员工这个对象Employee,你要玩游戏,而且在玩游戏的时候还会被老总给逮住,那你得去做一个PlayGame方法吧,这里我们很显然需要定义一个委 托类型的事件,把游戏的方法Games()通过事件关联起来。”
 
//员工类
public class Employee
{
    private string _name;
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
    private int _age;
    public int Age
    {
        get { return _age; }
        set { _age = value; }
    }
    /// <summary>
    /// 委托类型的事件
    /// </summary>
    public event DelegateMonitorEmployee PlayGame;
    public void Gages()
    {
        if (PlayGame != null)
        {
            CustomeEvetnArgs e = new CustomeEvetnArgs();
            e.Name = this._name;
            e.Age = this._age;
            PlayGame(this, e);
        }
    }
}
 
T:“你上面CustomeEvetnArgs这是什么玩意,以前我做程序的时候好象没看到过这个东东,是不是自己定义的?
 
M:“不错的吗?会发现问题了?不错,CustomeEvetnArgs是自己定义的一个类,他继承于系统EventArgs类,用来传递消息的,等会你就知道了,你玩游戏就是通过它把你的的名字等信息传递到老总那去的。既然你这么急着知道他是干什么的,那看看下面的定义。
 
/// <summary>
/// 事件参数基类EventArgs专门用于传递事件数据
/// 定义了两个成员,通过它可以传递两个数据(Name,Age)
/// </summary>
public class CustomeEvetnArgs:EventArgs
{
    string name = string.Empty;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
    int age = 0;
    public int Age
    {
        get { return age; }
        set { age = value; }
    }
 
    //无参构造方法
    public CustomeEvetnArgs()
    { }
}
 
--下面我们来看看老总(Admin)类里是怎么处理的,当员工(Employee)玩游戏(调用了PlayGame)的时候老总是怎么得到通知的。”
 
//老总类
public class Admin
{
    /// <summary>
    /// 呼叫老总--
    /// 通过CustomeEvetnArgs事件把玩游戏的员工信息传递过来
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    public void Notify(object sender,CustomeEvetnArgs e)
    {
        StringBuilder resutl = new StringBuilder();
        resutl.Append("员工:" + e.Name + " ");
        resutl.Append("年龄:" + e.Age.ToString() + "岁 ");
        resutl.Append("正在玩游戏! ");
        resutl.Append("时间:" + DateTime.Now.ToString());
        Console.WriteLine(resutl);
    }
 
M:“到这里,整个监视过程我们就完全建立好了。现在是该做实验的时候到了。老同学(Employee),你在去玩游戏试试,看看老总(Admin)是不是可以通过我们上面花这么多的功夫去建立的这个观察(监视)你的系统呢?”
T:“你说得比唱得还好听,就这么几十句代码,有你说的那么神吗?不就不信,好,我去试试。”
 
--张三(呵呵,前面忘了说,我那同学叫张三,今年22岁了。)打开了电脑,游戏启动
 
class Program
{
    static void Main(string[] args)
    {
        Employee employee = new Employee();
        employee.Name = "张三";
        employee.Age = 22;
        Admin admin = new Admin();
        //通过DelegateMonitorEmployee将两个类的交互进行了绑定,当employee.Games方法调用后,
        //触发PlayGame事件,而该事件将被委托给admin的Notify方法处理。
        employee.PlayGame += new DelegateMonitorEmployee(admin.Notify);
        employee.Gages();
    }
}
 
--这时,老总办公室里的警报声响了,老总打开电脑一看..........
 
--小张刚刚启动游戏,突然办公室门开了。进来了一个“人(Admin)”。
 
A:“张三,你胆子够大的嘛,昨天玩游戏还罚款你100个大洋,你今天还赶玩?等会到我办公室去我们聊一会!”
 
--哈哈,估计这次我这为同学要被洗白。。。。期待被抄中ing.......

  评论这张
 
阅读(903)| 评论(0)

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018