观察者模式

来源:互联网 发布:新秀丽拉杆箱20寸淘宝 编辑:程序博客网 时间:2024/04/25 06:41

观察者模式:定义了对象之间一对多的依赖关系,这样当一个对象(subject)改变的时候,其它对象(observer)会收到通知并自动更新。

在以下程序中,King既作为subject也作为observer。

OO原则:为对象之间的松耦合而努力。

 

策略模式,上篇文章中定义的一个抽象类,这里增加一个King类,继承自抽象类,实现了subject的功能,拥有一个对象引用的列表,对外提供增删对象的功能。

    abstract class Character
    {
        protected AttactBehavior At;//接口变量
        private string name;
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                this.name = value;
            }
        }
        public void fight()
        {
            if (At != null)
            {
                At.attact();
            }
        }
        public void setfightmethod(AttactBehavior At)
        {
            this.At = At;
        }
    }
    internal class Soldier : Character
    {
        public Soldier()
        {
            this.Name = "Solder";
        }
    }
    internal class King : Character
    {
        public King()
        {
            this.Name = "King";
        }
        ArrayList al = new ArrayList();
        public void Registercharacter(Character addcharacter)
        {
            if (!al.Contains(addcharacter))
            {
                al.Add(addcharacter);
            }
        }
        public void Removecharacter(Character removecharacter)
        {
            if (al.Contains(removecharacter))
            {
                al.Remove(removecharacter);
            }
        }
        public void Notifycharacter()
        {
            foreach (Character ch in al)
            {
                ch.fight();
            }
        }
    }

 

 

策略模式,上篇文章中定义的一个算法族:

 

 

    interface AttactBehavior
    {
        void attact();
    }
    internal class AttactWithKnife : AttactBehavior
    {
        public void attact()
        {
            Console.WriteLine("Attact with knife!");
        }
    }
    internal class AttactWithBox : AttactBehavior
    {
        public void attact()
        {
            Console.WriteLine("Attact with box!");
        }
    }

 

 

调用测试:

 

 

        static void Main(string[] args)
        {
            King K= new King();
            K.setfightmethod(new AttactWithKnife());
            Console.WriteLine(K.Name);
            Soldier a = new Soldier();
            a.setfightmethod(new AttactWithBox());
            Console.WriteLine(a.Name);
            Soldier b =new Soldier();
            b.setfightmethod(new AttactWithBox());
            Console.WriteLine(b.Name);
            Console.WriteLine("FirstTime");
            K.Registercharacter(a);
            K.Registercharacter(b);
            K.Registercharacter(K);
            K.Notifycharacter();
            Console.WriteLine("SecondTime");
            K.Removecharacter(a);
            K.Notifycharacter();
            Console.ReadLine();
        }

事实上,C#提供了事件机制,更加方便地实现观察者模式。