猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒

 

程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)

要求:  1.要有联动性,老鼠和主人的行为是被动的。

2.考虑可扩展性,猫的叫声可能引起其他联动效应。

 

     看了这题目觉得很有意思,仔细一想其实就是一个观察者的模式,用模式的术语来讲:
鼠和人都在观察者的立场上,猫则是被观察的主体:
 
详细讲来,要点有三:
  • 观察者注册主体,表明它对观察的意向

  • 状态发生变化时,主体向观察者通知这种变化情况

  • 观察者不再希望观察主体时,观察者从主体中撤消注册
 
 
想清楚了上面的时序,就不难定义程序所需要的接口,一个简单的示例如下:
     public   interface  IObserver
    
{
        
string Name
        
{
            
get;
            
set;
        }

        
/// <summary>
        
/// 主体发生变化后,观察者获得“通知”的方法
        
/// </summary>

        void Response();
    }



    
public   interface  ISubject
    
{
        
//主体需要提供“注册”方法,观察者可以注册自己感兴趣的内容
        void Register(IObserver observer);
        
//主体需要提供“撤销注册”方法,观察者可以不再观察
        void Unregister(IObserver observer);

    }


   /// <summary>
    
/// 主体:猫
    
/// </summary>

     public   class  Cat : ISubject
    
{
        List
<IObserver> observers;

        
public Cat()
        
{
            observers 
= new List<IObserver>();
        }


        
ISubject Members

        
ISubject Members
    }

   /// <summary>
   
/// 观察者:鼠
   
/// </summary>

     public   class  Mouse : IObserver
    
{


        
private string _name;


        
public Mouse(string name, ISubject subject)
        
{
            _name 
= name;
            subject.Register(
this);

        }



        
IObserver Members
    }


    
/// <summary>
    
/// 观察者:人
    
/// </summary>

     public   class  Master : IObserver
    
{

        
private string _name;

        
public Master(string name,ISubject subject)
        
{
            _name 
= name;
            subject.Register(
this);

        }


        
IObserver Members
    }


客户端代码:
    class  MainClass
    
{
        
public static void Main(string[] args)
        
{
            Cat cat 
= new Cat();
            Mouse m1 
= new Mouse("miky", cat);
            Mouse m2 
= new Mouse("doll", cat);
            Mouse m3 
= new Mouse("benn", cat);
            Mouse m4 
= new Mouse("bond", cat);
            Master m 
= new Master("Bennyxu", cat);
            cat.Cry();
          

            cat.Unregister(m);
            Console.WriteLine(
" after master has unregisted");
            cat.Cry();
            Console.ReadLine();


        }



    }

输出:
   
如果你熟悉.NET的事件模型的话,你会发现Delegate + Event会很容易达到这种效果。一个简单的示例如下:
    public   delegate   void  StateChangedHandler();

    
/// <summary>
    
/// 主体:被观察的对象
    
/// </summary>

     public   abstract   class  Subject
    
{
        
public event StateChangedHandler SubjectStateChanged;

        
protected void OnStateChanged()
        
{
            
if (SubjectStateChanged != null)
            
{
                SubjectStateChanged();
            }

        }




    }


    
/// <summary>
    
/// 观察者
    
/// </summary>

     public   abstract   class  Observer
    
{
        
public Observer(Subject subject)
        
{
            
//将Delegate绑定观察者的方法,与主体的事件关联
            subject.SubjectStateChanged += new StateChangedHandler(Response);

        }


        
/// <summary>
        
/// 观察者获得通知的方法(Delegate绑定到观察者的方法)
        
/// </summary>

        public abstract void Response;

    }





    
public   class  Mouse2 : Observer
    
{
        
private string _name;

        
public Mouse2(string name, Subject subject)
            : 
base(subject)
        
{
            _name 
= name;
        }

        
public override void Response()
        
{
            Console.WriteLine(_name 
+ "run");
        }

    }




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


        
public override void Response()
        
{
            Console.WriteLine(
"master woke up!!");
        }

    }



    
public   class  Cat2 : Subject
    
{
        
/// <summary>
        
/// 模拟主体发生变化
        
/// </summary>

        public void Cry()
        
{
            
base.OnStateChanged();
        }


        
/// <summary>
        
/// 指定的观察者撤销对主体的观察
        
/// </summary>
        
/// <param name="observer"></param>

        public void Unregister(Observer observer)
        
{
            
base.SubjectStateChanged -= new StateChangedHandler(observer.Response);
        }


    }



    
class  MainClass
    
{
        
public static void Main(string[] args)
        
{
            Cat2 cat 
= new Cat2();
            Mouse2 m1 
= new Mouse2("miky", cat);
            Mouse2 m2 
= new Mouse2("doll", cat);
            Mouse2 m3 
= new Mouse2("benn", cat);
            Mouse2 m4 
= new Mouse2("bond", cat);
            Master2 m 
= new Master2(cat);
            cat.Cry();


            cat.Unregister(m);
            Console.WriteLine(
"after remove master observer:");
            cat.Cry();

            Console.ReadLine();
        }



    }


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
观察者模式是一种行为设计模式,用于在对象之间建立一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都能够得到通知并自动更新。在观察者模式中,有两个主要角色:观察者和目标。 观察者模式的类图如下所示: ``` +-------------------+ +-------------------+ | Subject | | Observer | +-------------------+ +-------------------+ | | | | | + attach(observer: Observer) | | | + detach(observer: Observer) | | | + notify() | | + update() | | | | | +-------------------+ +-------------------+ ▲ ▲ | | | | +-------------------+ +-------------------+ | ConcreteSubject | | ConcreteObserver | +-------------------+ +-------------------+ | | | | | | | | +-------------------+ +-------------------+ ``` 在这个类图中,Subject是目标类,它维护了一个观察者列表,并提供了方法来添加、删除和通知观察者。Observer是观察者接口,定义了一个update()方法,用于接收目标的通知。ConcreteSubject是具体的目标类,它实现了Subject接口,并在状态发生改变时通知观察者。ConcreteObserver是具体的观察者类,它实现了Observer接口,并在接收到通知时更新自己的状态。 根据你提供的引用内容,观察者模式可以应用于大叫一声老鼠逃跑主人惊醒的场景中。具体的类图如下所示: ``` +-------------------+ +-------------------+ | Cat | | Mouse | +-------------------+ +-------------------+ | | | | | + meow() | | + run() | | | | | +-------------------+ +-------------------+ ▲ ▲ | | | | +-------------------+ +-------------------+ | Owner | | AlarmClock | +-------------------+ +-------------------+ | | | | | + wakeUp() | | + ring() | | | | | +-------------------+ +-------------------+ ``` 在这个类图中,Cat是目标类,它有一个meow()方法用于大叫一声。Mouse和Owner是观察者类,它们分别有一个run()方法和wakeUp()方法,用于老鼠逃跑主人惊醒。AlarmClock是另一个观察者类,它有一个ring()方法,用于响起闹钟。 当Cat调用meow()方法时,它会通知所有的观察者,即Mouse、Owner和AlarmClock,它们分别执行自己的动作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值