你的位置:首页 > 软件开发 > ASP.net > 观察者模式与事件监听机制

观察者模式与事件监听机制

发布时间:2015-07-27 18:00:05
一、观察者模式 1.1 概述 有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。它类似B/S架构模式,构建一个服务端,多个客户端显示。其实这个主题对象 ...

一、观察者模式

1.1 概述

有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。它类似B/S架构模式,构建一个服务端,多个客户端显示。其实这个主题对象就像是一个信息源,当信息源的状态发送变化时,它会通知所有订阅者,使它们进行相应的处理。在百度百科中的例子是,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。

1.2 模式中的参与者

  • 抽象主题(Subject):它把所有观察者对象的引用保存到一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,以及通知所有观察者。
  • 具体主题(ConcreteSubject):将有关状态存入具体观察者对象;当具体主题内部状态放生改变时,通知所有注册过的观察者。
  • 抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
  • 具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态保持一致。

                                          观察者模式与事件监听机制

注意

观察者的信息是来源于主题中notify方法所传递信息,比如notify(String str)传递字符str信息,观察者update(String strObj)就会接收str信息,并进行相关操作。

 

1.3 适用性

1.当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。

2.当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。

3.当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。

1.4 举例说明

公司开会,领导先通知各部门的负责人去会议室(注册、登记过程),在会议室中,大家都在等待领导的讲话(多个观察者关注同一个主题对象),领导开始说道,“今年的时间已过半了,可是业绩还没有完成预计的40%啊,大家可得努力”(通知过程),大家听到领导这番话时,市场部经理开始说话,“由于上半年的整个市场比较萎靡,因此市场拓展方面比较缓慢,但是经过上半年的调查,我们掌握了比较重要的信息,下半年,我们市场部肯定会拓展更多的份额”;研发部经理,“我们研发部会继续加班加点,保证完成任务”(各个观察者接到通知后的处理过程)。

ILeader:抽象主题(Subject)

public interface ILeader
{
	// 注册登记
	public void addManager(IManager manager);
	
	// 移除已注册的
	public void removeManager(IManager manager);
	
	// 通知所有经理
	public void notifyManagers(String str);
}

 

MyLeader:具体主题(ConcreteSubject)

public class MyLeader implements ILeader
{
	// 存储所有需注册登记的经理
	private List<IManager> managerList = new ArrayList<IManager>();
	@Override
	public void addManager(IManager manager)
	{
		synchronized (this)
		{
			if (manager != null && !(managerList.contains(manager)))
			{
				managerList.add(manager);
			}
		}
	}
	@Override
	public void removeManager(IManager manager)
	{
		synchronized (this)
		{
			if (managerList.contains(manager))
			{
				managerList.remove(manager);
			}
		}
	}
	@Override
	public void notifyManagers(String str)
	{
		for (IManager iManager : managerList)
		{
			iManager.update(str);
		}
	}
}

 

IManager:抽象观察者(Observer)

public interface IManager
{
	
	/**
	 * 更新
	 * @param str 与ILeader的通知参数一致
	 */
	public void update(String str);
}

 

MarketingManager:具体观察者(ConcreteObserver)

public class MarketingManager implements IManager
{
	@Override
	public void update(String str)
	{
		System.out.print("市场部接收到命令: ");
		doSomething(str);
	}
	private void doSomething(String str)
	{
		if (str.equals("努力"))
		{
			System.out.println("下半年,我们市场部肯定会拓展更多的份额");
		}
	}
}

 

DevelopManager:具体观察者(ConcreteObserver)

public class DevelopManager implements IManager
{ 
  @Override
  public void update(String str)
  {
    System.out.print("研发部接收到命令: ");
    doSomething(str);
  } 
  private void doSomething(String str)
  {
    System.out.println("我们研发部会继续加班加点,保证完成任务");
  }
}

 

测试类:

public class TestMain
{
	public static void main(String[] args)
	{
		ILeader leader = new MyLeader();
		IManager marketManager = new MarketingManager();	// 市场部
		IManager developManager = new DevelopManager();		// 研发部
		// 注册,登记过程
			// 方式一
		leader.addManager(marketManager);
		leader.addManager(developManager);
			// 方式二 匿名:以工程部为例
		leader.addManager(new IManager()					// 工程部
		{
			@Override
			public void update(String str)
			{
				System.out.print("工程部接收到命令: ");
				if (str.equals("努力"))
				{
					doSomething();
				}
			}
			private void doSomething()
			{
				System.out.println("我们工程部会加快工程的实施进度");
			}
		});
		System.out.println("领导讲话:先谈谈上半年的业绩!");
		// 通知过程
		System.out.println("发送努力命令");
		leader.notifyManagers("努力");	
	}
}

输出结果:

领导讲话:先谈谈上半年的业绩!

原标题:观察者模式与事件监听机制

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录