观察者模式

   前几天面试碰到了这样一道题,猫大吼一声,屋子里的老鼠全都开始逃跑,屋子的主人同时也被惊醒.用C#实现,当时我不知道如何去解,就写了一句用委托实现,呵呵!回来之后,在网上查了一下,才明白应该使用设计模式中的观察者模式,于是我就自己整理了一下这道题,写在这里,做个记号方便以后用得着的时候看一下.
  观察者模式(Oberver)就是一个被观察者和一个或者多个观察者组成!事件,事件委托,做事人为被观察者!监督他们运行和行动并做出自己的响应的人为观察者!
  首先建立被观察者的抽象类Subject
     

namespace Observer_Cat
{
    
/// <summary>
    
/// 声明委托,委托类型和触发事件的方法
    
/// 在观察者模式中,此类为Subject(主体)和抽象基类
    
/// </summary>

    public abstract class Subject
    
{
        
public Subject()
        
{
            
//
            
// TODO: 在此处添加构造函数逻辑
            
//
        }


        
public delegate void MyDelegate();//声明一个不带返回类型和参数的委托

        
public event MyDelegate MyDelegateEvent;//委托事件

        
/// <summary>
        
/// 封装了触发事件的方面
        
/// 为程序提供完整性,除观察者以外的所有成员都不能直接调用.
        
/// </summary>

        protected void Notify()
        
{
            
this.MyDelegateEvent();
        }

    }

}

再接着建立一个观察者的抽象类Observer
   
namespace Observer_Cat
{
    
/// <summary>
    
/// 构造函数中,注册事件。
    
/// 在观察者模式中,此类相当与所有观察者的基类
    
/// 所有观察者都必须继承此类
    
/// </summary>

    public abstract class Observer
    
{
        
public Observer(Subject subject)
        
{
            subject.MyDelegateEvent 
+=new Observer_Cat.Subject.MyDelegate(Hack);
        }


        
public Observer(Subject subject,string strName)
        
{
            subject.MyDelegateEvent 
+=new Observer_Cat.Subject.MyDelegate(Hack);
        }


        
public abstract void Hack();
    }

}
为猫添加一个类继承于Subject添加猫叫的方法
 
namespace Observer_Cat
{
public class Cat:Subject
    
{
        
public Cat()
        
{
        }


        
public void Cry()
        
{
            Console.WriteLine(
"猫大吼一声");
            
this.Notify();
        }

    }

}
再接者是为老鼠逃走和惊醒主人添加类继承于Observer
 
namespace Observer_Cat
{
public class Mouse:Observer
    
{
    
        
string str;
        
public Mouse(Subject subject,string strName):base(subject,strName)
        
{
        str 
= strName;
        }


        
public override void Hack()
        
{
            Console.WriteLine(str
+ "开始逃跑");
        }


    }


    
public class Master:Observer
    
{
        
public Master(Subject subject):base(subject)
        
{}

        
public override void Hack()
        
{
            Console.WriteLine(
"主要被惊醒");
        }


    }

}
最后就是主程序
  
namespace Observer_Cat
{
    
/// <summary>
    
/// ThreadMain的摘要说明。
    
/// </summary>

    class ThreadMain
    
{
        
/// <summary>
        
/// 应用程序的主入口点。
        
/// </summary>

        [STAThread]
        
static void Main(string[] args)
        
{
            
//
            
// TODO: 在此处添加代码以启动应用程序
            
//
            Cat cat = new Cat();
            Mouse mouse1 
= new Mouse(cat,"一只老鼠");
            Mouse mouse2 
= new Mouse(cat,"二只老鼠");
            Master master 
= new Master(cat);

            cat.Cry();

            Console.ReadLine();

        }

    }

}
运行结果:
         

    这些代码是我参考网上的资源写出来的,有不妥的地方还请各位大侠指正,共同进步.

posted on 2007-03-21 19:04  不懂  阅读(341)  评论(1编辑  收藏  举报

导航