注册本站  论坛  繁體中文

电脑技巧
手机 | MP3 | MP4 | 显卡 | 主板 | 显示器 | 光存储 | 笔记本 | 网络设备 | 移动存储 | 数码相机
键鼠 | CPU | 音箱 | GPS | 电视 | 服务器 | 投影机 | 机箱电源 | 品牌电脑 | 办公打印 |
| 网站首页 | Cisco | Windows | Linux | Java | Dotnet | Oracle | 网页设计 | 平面设计 | 安全 | 软件应用 | 电脑维修 | 办公维修 |
您现在的位置: 电脑技巧 >> Dotnet >> .NET FRAMEWORK >> Dotnet正文

观察者模式 The Observer Pattern

文章来源:中国IT实验室搜集整理 作者:佚名 更新时间:2008-6-28 19:54:03 【 】 【加入收藏
   观察者模式——定义了对象之间的一对多依赖,这样一来,当一个对像改变状态时,它的所有依赖者都会收到通知并自动更新。(摘自《Head First Design Patterns》)        以下是自已用VS画了一个简图:         

         首先创建司令官和小队的接口:

        <FONT size=+0><FONT size=+0>
        /// <summary>
        /// 主题对象
        /// </summary>
            public interface ISubject
            {
                List<IObserver> Observers
                {
                    get;
                    set;
                }
                void RegisterObserver(IObserver observer);
                void RemoveObserver(IObserver observer);
                void NotifyObservers(string command);
            }
        /// <summary>
        /// 观察者
        /// </summary>
            public interface IObserver
            {
                void Update(string command);
            }
        </FONT></FONT>

        实现一个司令官(当然你也可以实现多个):    

        <FONT size=3>
        /// <summary>
        /// 司令官
        /// </summary>
            public class Commander : ISubject
            {
                #region ISubject 成员
                private List<IObserver> _observers;
                public List<IObserver> Observers
                {
                    get
                    {
                        return _observers;
                    }
                    set
                    {
                        _observers = value;
                    }
                }

                public Commander()
                {
                    _observers = new List<IObserver>();
                }

                public void RegisterObserver(IObserver observer)
                {
                    this.Observers.Add(observer);
                }

                public void RemoveObserver(IObserver observer)
                {
                    this.Observers.Remove(observer);
                }

                public void NotifyObservers(string command)
                {
                    foreach (IObserver observer in this.Observers)
                    {
                        observer.Update(command);
                    }
                }

                #endregion

                public void SetCommand(string command)
                {
                    Console.WriteLine(string.Format("司令官下命令:{0}", command));
                    NotifyObservers(command);
                }
            }
        </FONT>

 

       实现三个小队:   

        <FONT size=3>
        /// <summary>
        /// 斧头小队
        /// </summary>
            public class AxeTeam : IObserver
            {
                #region IObserver 成员

                public void Update(string command)
                {
                    switch (command)
                    {
                        case "攻击":
                            Console.WriteLine("斧头小队:用斧头攻击,势死如归!");
                            break;
                        case "撤退":
                            Console.WriteLine("斧头小队:坚守阵地,死也不放弃!");
                            break;
                    }
                }

                #endregion
            }

        /// <summary>
        /// 弓箭手小队
        /// </summary>
            public class BowAndArrowTeam : IObserver
            {
                #region IObserver 成员

                public void Update(string command)
                {
                    switch (command)
                    {
                        case "攻击":
                            Console.WriteLine("弓箭手小队:弓箭手掩护,退后十步,射箭!");
                            break;
                        case "撤退":
                            Console.WriteLine("弓箭手小队:边撤退,边掩护斧头小队!");
                            break;
                    }
                }

                #endregion
            }

        /// <summary>
        /// 匕首小队
        /// </summary>
            public class KnifeTeam : IObserver
            {
                #region IObserver 成员

                public void Update(string command)
                {
                    switch (command)
                    {
                        case "攻击":
                            Console.WriteLine("匕首小队:匕首攻击,打不过就跑!");
                            break;
                        case "撤退":
                            Console.WriteLine("匕首小队:快撤啊,我军大势已去!");
                            break;
                    }
                }

                #endregion
            }
        </FONT>

        最后我们开始使用它用:

        <FONT size=+0>

        //实例化司令官和三个小队

        Commander commander = new Commander();

        AxeTeam axe = new AxeTeam();

        BowAndArrowTeam baa = new BowAndArrowTeam();

        KnifeTeam knife = new KnifeTeam();

        //注册观察者

        commander.RegisterObserver(axe);

        commander.RegisterObserver(baa);

        commander.RegisterObserver(knife);

        //司令官下命令

        commander.SetCommand("攻击");

        commander.SetCommand("撤退");

        //匕首小队怕死,从军队中删除

        commander.RemoveObserver(knife);

        //司令官再次下命令

        commander.SetCommand("攻击");

        commander.SetCommand("撤退");</FONT>


        输出的结果是:

        司令官下命令:攻击

        斧头小队:用斧头攻击,势死如归!

        弓箭手小队:弓箭手掩护,退后十步,射箭!

        匕首小队:匕首攻击,打不过就跑!

        司令官下命令:撤退

        斧头小队:坚守阵地,死也不放弃!

        弓箭手小队:边撤退,边掩护斧头小队!

        匕首小队:快撤啊,我军大势已去!

        司令官下命令:攻击

        斧头小队:用斧头攻击,势死如归!

        弓箭手小队:弓箭手掩护,退后十步,射箭!

        司令官下命令:撤退

        斧头小队:坚守阵地,死也不放弃!

        弓箭手小队:边撤退,边掩护斧头小队!

        一个简单的观察者模式就介绍完毕,当然里面那些传递命令还用了一些SWITCH,有人会说这可以重构啊。本文意在介绍观察者模式,那些只不过是内容而已,在以后的模式中会用一个新的模式重新设计这一块。

  • 上一篇Dotnet:

  • 下一篇Dotnet: 没有了
  • 最 新 热 门
     web.config配置文件中的 元素
     为网站添加业务层
     用SqlDataSource实现DataList嵌套DataList
     Visual Studio 2003插件的编写
     千条DOS命令收藏
     IIS 常见问题
     IIS需要的最小NTFS权限
     优化 .NET的性能
     设计模式与VB .net代码 外观模式,合成模式
     VB.net中介者模式
    最 新 推 荐
     观察者模式 The Observer Pattern
     petshop4体现的面向接口编程思想
     从进程得到该进程关联图标的方法
     VB2003-2008 遍历控件的方法
     FormatNumber函数介绍
     .NET Framework的剖析
     .NET Framework 2.0升级3.5认证方案
     .Net Framework下安装Windows服务
     VS2008 和.NET Framework3.5新功能及相关技…
     公布.NET Framework 2.0升级3.5方案
    相 关 文 章

    VB.net中介者模式
    VB.net 学习设计模式(中介者模式)
    深入ASP.NET 2.0的提供者模型

    | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告

     

    Copyright 2006-2008 pcjx.com All Rights Reserved
    电脑技巧 版权所有 粤ICP备06059145号 地图
    本网站所有内容未经许可不得转载或做其他使用