观察者模式

程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。
要求:  
            1.要有联动性,老鼠和主人的行为是被动的。
            2.考虑可扩展性,猫的叫声可能引起其他联动效应。

要点:1. 联动效果,运行代码只要执行Cat.Cryed()方法。
 
      2. 对老鼠和主人进行抽象
class Observer
{

public:

 virtual void Response();//对被观察对象的行为作出反应,这里是指猫叫了,老鼠和人的反应
};
class Subject
{

public:

 virtual void AddObserver(Observer obj);//添加所有的观察者,在发生动作时对他们进行通知
};


猫类(被观察的对象)
class Cat : public Subject
{
public:

	ArrayList arrlyList;
	Cat(){ arrlyList = new ArrayList(); }
	void AddObserver(Observer obj)//实现添加观察着对象的方法    
	{
		arrlyList.Add(obj);
	}    
	void Cry()//猫叫了,并通知所有的观察者,作出相应的反应    
	{
		MessageBox("猫叫了......");        
		foreach(Observer obj in arrlyList)
		{
			obj.Response();
		}
	}
};


观察者:老鼠、人
class Mouse : public Observer
{
public:
	Mouse(Cat c)//将当前的观察着对象添加到观察者集合中    
	{ 
		c.AddObserver(this); 
	}
	void Response()
	{ 
		MessageBox("老鼠开始逃跑了.....");
	}
};
class People : public Observer
{
public:
	People(Cat c)//将当前的观察着对象添加到观察者集合中   
	{ 
		c.AddOberver(this); 
	}
	void Respone() 
	{ 
		MessageBox("人醒了,What's Wrong?");
	}
};


主函数中
Btn_Click(Object sender,EventArgs e)
 {
    Cat c=new Cat();
    Mouse m=new Mouse(c);
    People p=new People(c);
    c.Cry();
 }


好了,到这里这道程序设计题的解决方案也就是这些了,通过这两种不同的解决方案我们可以发现,在针对多个不同的观察者时,使用观察着实现联动性,比较方面,而且可扩展性也比较强,事实上观察者模式也就是主要用于对多个不同的观察者对象做出不同反应而设计的。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。

观察者模式的优缺点

Observer模式的优点是实现了表示层和数据逻辑层的分离,并定义了稳定的更新消息传递机制,类别清晰,并抽象了更新接口,使得可以有各种各样不同的表示层(观察者)。

但是其缺点是每个外观对象必须继承这个抽像出来的接口类,这样就造成了一些不方便,比如有一个别人写的外观对象,并没有继承该抽象类,或者接口不对,我们又希望不修改该类直接使用它。虽然可以再应用Adapter模式来一定程度上解决这个问题,但是会造成更加复杂烦琐的设计,增加出错几率。

观察者模式的效果有以下几个优点:

(1)观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体现察者聚集,每一个具体现察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。

(2)观察者模式支持广播通信。被观察者会向所有的登记过的观察者发出通知。

观察者模式有下面的一些缺点:

(1) 如果一个被观察者对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

(2)如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察考模式时要特别注意这一点。

(3)如果对观察者的通知是通过另外的线程进 行异步投递的话,系统必须保证投递是以自恰的方式进行的。

(4)虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值