设计模式_观察者模式

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace ConsoleApplication1
{
    //观察者模式 1,抽象主题(要观察的东东)2,实现主题 3,抽象观察者 4,实现观察者
    //抽象主题要实现的功能:添加及删除观察者,主题变化了,要通知观察者
    public abstract class subject //抽象类可以共存抽象方法与非抽象方法
    {
        private ArrayList bservers = new ArrayList();//存储观察者集合
        public  void add(observer observer)
        {
            observers.Add(observer);
        }

        public  void delete(observer observer)
        {
            observers.Remove(observer);
        }

        //主题发生变化要通知观察者
        public  void notify()
        {
            foreach (observer obs in observers)
                //最终通过调用观察者update方法实现通知观察者,主题发生了变化

                obs.update();
        }

    }

    public class concretesubject : subject
    {
        //在具体的主题中添加具体的主题信息吧
        private string subjectstatus;
        public string Subjectstatus
        {
            get
            {
                return subjectstatus;
            }
            set
            {
                subjectstatus = value;
            }
        }
    }



    public abstract class observer
    {
        public abstract void update();//具体的通知在子类实现
    }

    public class concreteobserver : observer
    {
        //观察者要知道观察哪些主题吧
        private string name;//观察者名字
        private string observerstatus;//存储主题的变化数据
        private concretesubject sub;
        public concreteobserver(concretesubject sub, string name)
        {
            this.sub = sub;
            this.name = name;
        }

        //观察者中实现更新方法,用于接收主题的变化数据
        public override void update()
        {
            bserverstatus = this.sub.Subjectstatus;
            Console.WriteLine("观察者{0}的新状态是:{1}", name, observerstatus);
        }
    }

    //客户端
    class Program
    {
       
        static void Main(string[] args)
        {
           //在客户调调用观察者模式
            //实例化一个真实主题
            concretesubject conc = new concretesubject();
            conc.Subjectstatus = "111";
            //在真实主题添加多个观察者
            concreteobserver obj1 = new concreteobserver(conc, "翟勋杨");
            conc.add(obj1);

            //observer obj2 = new concreteobserver(conc, "翟勋章");
            //conc.add(obj2);

            conc.notify();
            Console.ReadKey();

        }
        
    }

}

后记:
 public concreteobserver(concretesubject sub, string name)
        {
            this.sub = sub;
            this.name = name;
        }

上述代码一定要加this,不然会导致sub没有初始化值,或者采用全局与局部变量区别命名的方法来实现.

小结:1,局部变量与全局变量的命名一定要规范
            2,仅看代码差太远,一定要编写,起码把人家的代码敲写一次也是大有裨益
   


请使用浏览器的分享功能分享到微信等