設計模式_觀察者模式

wisdomone1發表於2012-06-14
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,僅看程式碼差太遠,一定要編寫,起碼把人家的程式碼敲寫一次也是大有裨益
   


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-732814/,如需轉載,請註明出處,否則將追究法律責任。

相關文章