猫、老鼠、主人联动问题

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

要求: 

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

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

 
整个思路是采用订阅者设计模式(观察者模式),具体怎么叫就随大家想法。我采用Windows的应用程序讲解
 
下面是发布者抽象模块
 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace InterviewDemo
{
    public delegate void testHandler();
    public abstract class Pubish
    {
        public event testHandler handler;
        public void Activtion()
        {
            if (handler != null)
            {
                this.handler();
            }
        }
    }
}
下面是订阅者抽象模块
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace InterviewDemo
{
    public abstract class Subscription
    {
        public Subscription(Pubish _pubish)
        {
            _pubish.handler += new testHandler(_pubish_handler);
        }

        public virtual void _pubish_handler() { }
    }
}

  

  

猫模块

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace InterviewDemo
{

    public class Cat : Pubish
    {
        public string Name { get; private set; }

        public Cat(string Name)
        {
            this.Name = Name;
        }

        public void Shouted()
        {
            MessageBox.Show(Name + "叫了一声!");
            this.Activtion();
        }
    }
}

老鼠模块

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace InterviewDemo
{
    public class Mouse : Subscription
    {
        public string Name { get; private set; }
        public Mouse(string Name, Pubish p)
            : base(p)
        {
            this.Name = Name;
        }
        public override void _pubish_handler()
        {
            MessageBox.Show(Name + "听到叫声");
        }

    }
}

主人模块

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace InterviewDemo
{

    public class Master : Subscription
    {

        public string Name { get; private set; }

        public Master(string Name, Pubish p)
            : base(p)
        {
            this.Name = Name;
        }
        public override void _pubish_handler()
        {
            MessageBox.Show(Name + "听到叫声!");
        }

    }
}

程序实现的按钮事件

        private void button1_Click(object sender, EventArgs e)
        {
            Cat cat = new Cat("猫");
            Mouse mouse = new Mouse("老鼠", cat);
            Master master = new Master("主人", cat);
            cat.Shouted();
        }
 
考这个的目的是在看大家对订阅者模式的熟知度,前面的发布者、订阅者都采用抽象,方便以后的扩展,
熟悉此模式后可在很多场合应用。

 

原文地址:https://www.cnblogs.com/jinacookies/p/1999338.html