zoukankan      html  css  js  c++  java
  • 设计模式之Observer Pattern

    观察者模式,是一种一对多的设计模式,观察者与被观察者存在着某种关系,当被观察者的状态发生转变时,观察者要求作出相应动作。从这个意义上来说,在这个一对多的设计模式中,“一”指的是被观察者,“多”指的是观察者。观察者很多时候都会要求注册到被观察者中,以便当被观察者状态改变时,观察者能够及时的得到响应。所有的观察者都只关心某一被观察者的状态,这么一来,如果有多个被观察者,事实上,观察者都只会注册到其感兴趣的部分。

    典型的观察者模式,是猫叫-主人醒-贼跑,下面用观察者模式来实现这一系列动作。

    首先来定义观察者的接口

    1    public interface IObserver
    2    {
    3        void Response();
    4    }

    再来是被观察者

    1    public interface ISubject
    2    {
    3        void Register(IObserver observer);
    4        void Unregister(IObserver observer);
    5    }

    下面是具体的角色

     1    public class Master : IObserver
     2    {
     3        protected string name;
     4
     5        public Master(string name, ISubject subject)
     6        {
     7            this.name = name;
     8            subject.Register(this);
     9
    10            Console.WriteLine(string.Format("{0} sleeping", name));
    11        }

    12
    13        IObserver Members
    21    }

    22
    23    public class Thief : IObserver
    24    {
    25        protected string name;
    26
    27        public Thief(string name, ISubject subject)
    28        {
    29            this.name = name;
    30            subject.Register(this);
    31
    32            Console.WriteLine(string.Format("{0} trying to thieve", name));
    33        }

    34
    35        IObserver Members
    43    }

    44
    45    public class Cat : ISubject
    46    {
    47        protected List<IObserver> observers;
    48        protected string name;
    49
    50        public Cat(string name)
    51        {
    52            this.name = name;
    53            observers = new List<IObserver>();
    54        }

    55
    56        public void Cry()
    57        {
    58            Console.WriteLine(string.Format("{0} cry", name));
    59            foreach (IObserver item in observers)
    60            {
    61                item.Response();
    62            }

    63        }

    64
    65        ISubject Members
    80    }

    OK, 我们来Test一下

     1    class Program
     2    {
     3        static void Main(string[] args)
     4        {
     5            Cat cat = new Cat("Cat");
     6            Master master = new Master("Master", cat);
     7            Thief thief = new Thief("Thief", cat);
     8
     9            cat.Cry();
    10            Console.ReadLine();
    11        }

    12    }
  • 相关阅读:
    [mysql] update……from……
    [python]接口签名
    [同步脚本]mysql-elasticsearch同步
    什么是Java Marker Interface(标记接口)
    input type="submit" 和"button"有什么区别
    发现个工具,查询Mongo数据使用mysql语法
    红黑树和AVL树(平衡二叉树)区别
    C# 字符串转义和反转义
    MySQL变量的使用
    HTML <form> 标签
  • 原文地址:https://www.cnblogs.com/LeoWong/p/1267401.html
Copyright © 2011-2022 走看看