首页 > 代码库 > 由观察者模式的升级,得出委托代理

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

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




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