由观察者模式的升级,得出委托代理

来源:互联网 发布:编程猫的网址 编辑:程序博客网 时间:2024/05/26 07:29

           大家在实际项目开发过程成,有这么一种情况:在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 (具体观察者对象.更新的方法);这个方式进行委托代理。委托就是一种引用方法的类型。一旦委托分配了方法,委托将与方法具有完全相同的行为。委托的方法使用可以像其他的方法一样。具有相同参数、返回值。我们平常可以看成函数的抽象类;委托的实例实际就是一个具体的函数。一个委托可以搭载多个方法,从而替换我们循环去查找,调用的方式;另外它只是代理其方法,其本身是什么类型并不用去关系。我们在文章最开始的讲的情况就迎刃而解了,你明白了吗?




0 0
原创粉丝点击