observer模式的2个实现

来源:互联网 发布:淘宝 软件官网下载 编辑:程序博客网 时间:2024/06/15 10:18
    //来个综合一点的吧,某生产线生产A,B 2个产品,当产品售出一件时分别通知A,B2个生产线的经理,并考虑以后还有可能会生产其他商品    //销售事件    interface ISoldNotify    {        void Notify();    }    abstract class Product:ISoldNotify    {        private IObserver obs;        public IObserver OBS        {            get { return obs; }            set { obs = value; }        }        public void Notify()        {            if (obs != null)            {                obs.GetMessage();            }        }    }        class ProductA:Product    {    }    class ProductB: Product    {    }    interface IProductFactory    {        Product CreateProduct();    }    class ProductAFactory : IProductFactory    {        public Product CreateProduct()        {            return new ProductA();        }    }    class ProductBFactory : IProductFactory    {        public Product CreateProduct()        {            return new ProductB();        }    }    interface IObserver    {        void GetMessage();    }    class ManagerA : IObserver    {        public void GetMessage()        {            Console.WriteLine("A商品卖出一个");        }    }    class ManagerB : IObserver    {        public void GetMessage()        {            Console.WriteLine("B商品卖出一个");        }    }    class Program    {        static void Main()        {            IProductFactory factory = new ProductAFactory();            Product product = factory.CreateProduct();            product.OBS = new ManagerA();            product.Notify();            Console.Read();        }    }

第二个例子是用事件实现的observber,并且是线程安全的

 class EmailManager    {        private event EventHandler<PublishEventArgs> NewEmailEvent;        public void Attach(EventHandler<PublishEventArgs> observer)        {            NewEmailEvent += observer;        }        public void Detach(EventHandler<PublishEventArgs> observer)        {            NewEmailEvent -= observer;        }        public void SimulateNewMail(string from, string to, string message)        {            PublishEventArgs e = new PublishEventArgs(from, to, message);            OnPublish(e);        }        public void OnPublish(PublishEventArgs e)        {            EventHandler<PublishEventArgs> temp = Interlocked.CompareExchange(ref NewEmailEvent, null, null);            if (temp!= null)            {                NewEmailEvent(this, e);            }        }    }    interface IObserver    {        void HandlerEmail(object sender, PublishEventArgs e);    }    class Logger:IObserver    {        public void HandlerEmail(object sender, PublishEventArgs e)        {            Console.WriteLine(string.Format("{0}{1}{2}{3}",e.From,e.To,e.Msg,"已经写入日志"));        }        }    class Printer:IObserver    {        public void HandlerEmail(object sender, PublishEventArgs e)        {            Console.WriteLine(string.Format("{0}{1}{2}{3}", e.From, e.To, e.Msg, "已经输出打印"));        }        }    class PublishEventArgs : EventArgs    {        private string msg;        private string from;        private string to;        public string From        {            get { return from; }        }        public string To        { get { return this.to; } }        public string Msg        { get { return msg; } }        public PublishEventArgs(string from,string to,string msg)        {            this.from = from;            this.to = to;            this.msg = msg;        }    }    class Program    {        static void Main()        {            EmailManager em = new EmailManager();            IObserver logger = new Logger();            em.Attach(logger.HandlerEmail);            IObserver printer = new Printer();            em.Attach(printer.HandlerEmail);            //新来一封邮件            em.SimulateNewMail("wen", "Li", "Hello");            Console.Read();                             }        }



0 0