.NET图像界面按钮的clicked事件浅谈(2)


    class Program
    {
        static void Main(string[]args)
        {
            DrawManagerdrawManager = new DrawManager();
            Rectanglerect = new Rectangle(drawManager);
            Squaresquare = new Square(drawManager);
            //引发事件
            drawManager.SizeChange(5);

            //解除监听事件
            square.Detach(drawManager);
            drawManager.SizeChange(10);
            Console.ReadLine();
        }
    }
/*运行结果
  The Rectangle'length=10 and width=5.
  The Square'Length = 5
  The Rectangle'length=20 and width=10.
 */


.NET中的事件模式和观察者模式非常相似,也可谓是观察者模式在.NET下的进化版吧,下面用观察者模式实现上面功能以做对比,首先定义两个接口,IObserver和IObservable,如下

复制代码 代码如下:


public interface IObserver
    {
        voidNotify(DrawEventArgs e);
    }
    public interface IObservable
    {
        voidRegister(IObserver observer);
        voidUnRegister(IObserver observer);
    }


下面是改写后的两个观察者类,

复制代码 代码如下:


    public class NewRectangle:IObserver
    {
        privateObserverManager m;
        publicNewRectangle(ObserverManager oManager)
        {
            m=oManager;
            oManager.Register(this);
        }
        public void Notify(DrawEventArgse)
        {
            Console.WriteLine(string.Format("TheRectangle'length={0} and width={1}.", e.Size * 2, e.Size));
        }
        public void Detach()
        {
            m.UnRegister(this);
        }
    }
    public class NewSquare:IObserver
    {
        privateObserverManager m;

        publicNewSquare(ObserverManager oManager)
        {
            m=oManager;
            oManager.Register(this);
        }
        public void Notify(DrawEventArgse)
        {
            Console.WriteLine(string.Format("TheSquare'Length = {0}.", e.Size));
        }
        public void Detach()
        {
            m.UnRegister(this);
        }
    }


下面是负责通知观察者的类型,

复制代码 代码如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjgsgs.html