0
点赞
收藏
分享

微信扫一扫

【设计模式】观察者

芷兮离离 2022-03-12 阅读 110

        观察者模式是一种行为型设计模式,主要为了实现方法和对象的分离。本例模拟了下雨后不同角色的反应。在例子中,天气作为被观察对象,继承自IObject接口,农民、诗人和行人作为观察者都继承自IObserver接口。农民、诗人和行人的不同反应都是由下雨这件事情引起的。示例代码如下,本人水平有限,理解不当的地方不要笑话我! ^_^

namespace Observer.Demo
{
    /// <summary>
    /// 声明一个观察对象接口,定义观察者注册方法和观察对象发生变化的方法
    /// </summary>
    public interface IObject
    {
        /// <summary>
        /// 观察者注册方法
        /// </summary>
        /// <param name="observer">观察者</param>
        void AddObserveObject(IObserver observer);

        /// <summary>
        /// 观察对象发生变化时的方法
        /// </summary>
        void Invoke();
    }
}
namespace Observer.Demo
{
    /// <summary>
    /// 声明一个观察者接口,定义观察对象发生变化时自身的回应方法
    /// </summary>
    public interface IObserver
    {
        /// <summary>
        /// 观察对象发生变化时,观察者的回应方法
        /// </summary>
        void Response();
    }
}
namespace Observer.Demo
{
    /// <summary>
    /// 天气类,是所有观察者的观察对象,继承自IObject接口
    /// </summary>
    public class Weather : IObject
    {
        private List<IObserver> _observers = null;

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

        /// <summary>
        /// 观察者注册方法
        /// </summary>
        /// <param name="observer">观察者</param>
        public void AddObserveObject(IObserver observer)
        {
            this._observers.Add(observer);
        }

        /// <summary>
        /// 观察对象发生变化时的方法
        /// </summary>
        public void Invoke()
        {
            Console.WriteLine("天气:淅沥淅沥的小雨开始下起来了,不知道大家都在忙什么?");
            Console.WriteLine("--------------------------------------------------------");

            foreach (var item in _observers)
            {
                item.Response();
            }
        }
    }
}
namespace Observer.Demo
{
    public class Farmer : IObserver
    {
        /// <summary>
        /// 农民类
        /// </summary>
        public void Response()
        {
            Console.WriteLine("农民:我要种庄稼了,不要辜负了这春雨!");
        }
    }
}
namespace Observer.Demo
{
    /// <summary>
    /// 诗人类
    /// </summary>
    public class Poet : IObserver
    {
        public void Response()
        {
            Console.WriteLine("诗人:春雨贵如油啊,我要把它写到诗词里!");
        }
    }
}
namespace Observer.Demo
{
    public class Walker : IObserver
    {
        /// <summary>
        /// 行人类
        /// </summary>
        public void Response()
        {
            Console.WriteLine("行人:这雨下的真不是时候,我要打上伞,不然要被淋湿了!");
        }
    }
}
namespace Observer.Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            //实例化观察对象
            IObject weather = new Weather();

            //实例化观察者对象
            IObserver farmer = new Farmer();
            IObserver poet = new Poet();
            IObserver walker = new Walker();

            //注册观察者
            weather.AddObserveObject(farmer);
            weather.AddObserveObject(poet);
            weather.AddObserveObject(walker);

            //观察对象发生变化
            weather.Invoke();

            Console.ReadLine();
        }
    }
}

 

 

举报

相关推荐

0 条评论