首页 > 代码库 > 由观察者模式的升级,得出委托代理
由观察者模式的升级,得出委托代理
大家在实际项目开发过程成,有这么一种情况:在VS2010开发环境中,当我们创建一个页面后,我们将鼠标移动到设计界面时候,系统会自动显示能拖的组件;当鼠标移动到代码界面时候,系统自动隐藏组件;这个是怎么实现的呢?我们慢慢来将。咱先看看什么是观察者模式:定义了1对多的依赖关系,让多个观察者对象同时监听某一个主题对象;这个主题对象发生变化的时候,会通知所有的观察者对象,让他们能够自己更新自己。就是说我们又个类中可以添加、删除观察者对象,当我们的这个类中的状态发生改变的时候,循环调用此类中所有观察者的更新方法;从而达到更新各观察者对象的信息。
我们先来分析Observer类,其实它就只有个更新的方法(Update()),实现对具体的观察对象的更新;
abstract class Observer { public void Update(); }抽象类Subject类,完成添加、删除和通知各观察者对象更新的功能;
abstract class Subject { private IList<Observer> observers=new List<Observer>(); //增加观察者对象 public void Attach( Observer tmp) { observers.add(tmp); } //删除观察者对象 public void Detach( Observer tmp) { observers.delete(tmp); } //通知更新数据 public void Notify() { foreach( Observer tmp in observers) { tmp.Update(); } } }
具体的主题类实际上就只有状态改变的时候,实现对状态值的赋值:
class ConcreteSubject:Subject { private string subjectState; public string SubjectState { get{return subjectState;} set{ subjectState=value;} } }具体的观察者角色可以保存一个具体的主题类,当主题类的状态发生改变的,调用更新方法更新数据;
class ConcreteObserver:Observer { private string name; private string observerState; private ConcreteSubject subject; public ConcreteObserver(ConcreteSubject subject,string name) { this.name=name; this.subject=subject; } public override void Update() { observerState =subject.SubjectState; Console.WriteLine("观察者{0}的更新状态为:{1}",name,observerState); } }客户端的代码比较简单:
static void Main(String[] arg) { ConcreteSubject s=new ConcreteSubject(); s.Attach(new ConcreteObserver(s,"A")); s.Attach(new ConcreteObserver(s,"B")); s.Attach(new ConcreteObserver(s,"C")); s.SubjectState="Updated"; s.Notify(); }
由此,委托事件代理闪亮登场;这个是什么东东呢?就是我们先申明一个代理delegate void Evenhandler();
我们在具体的主题中申明一个事件:public Evenhandler update; 在通知的方法中调用update();在实际的客户调用的时候,则是具体主题对象.Update+=new Evenhandler (具体观察者对象.更新的方法);这个方式进行委托代理。委托就是一种引用方法的类型。一旦委托分配了方法,委托将与方法具有完全相同的行为。委托的方法使用可以像其他的方法一样。具有相同参数、返回值。我们平常可以看成函数的抽象类;委托的实例实际就是一个具体的函数。一个委托可以搭载多个方法,从而替换我们循环去查找,调用的方式;另外它只是代理其方法,其本身是什么类型并不用去关系。我们在文章最开始的讲的情况就迎刃而解了,你明白了吗?
由观察者模式的升级,得出委托代理