学习设计模式感悟系列--观察者模式

学习使用设计模式也有一段时间了,苦于当初没有分享到太好的心得,所以其间遇到不少困难,也走了很多弯路,磕磕绊绊到现在使用设计模式已经略懂一二,不敢私藏,分享给正在学习设计模式且为之苦恼的同学。

 

设计模式,其实没有那么可怕,学习每一个设计模式的时候,学习重点其实不是看懂其代码,设计模式的精髓也不只是那些代码,而是思想,思路;那些代码充其量也只是思路的实现而以,所以我们在学习一个新的设计模式的时候,需要先弄清楚,到底每一个模式都有什么样的机制,用的是什么样的思路,然后,先自己按照这个思路,写一个雏形,再看看到底自己写的与标准的做法有何不同,这样学习,能够达到立竿见影的效果。

 

我们开始介绍第一个模式:观察者模式

我先讲讲观察者这个模式是做什么用的,所谓观察者模式(我们可以忘记这个名字,管他叫什么都没有关系,我们关注的是机制),要达到的效果是这样的:

1:先定义两个对象 ,一个叫做观察者,另外一个叫做主题,这两个对象的名字,大家可以暂且不管,也不用管为什么要如此称呼,只知道是两个对象就可以,这样更加有助于学习

2:观察者对象与主题,是多对一的关系,一个主题对应多个观察者

3:每个观察者,都可以通过统一的方法添加主题,或删除主题,与主题建立或取消关系

4:每个主题,都可以通过一个统一的方法,通知每一个观察者(通过调用每一个观察者定义好的函数)

代码中是这样用:

 

        观察者1.添加被观察的主题(主题1);

        观察者2.添加被观察的主题(主题1);

 

主题1.提醒观察者();

 

运行结果应该是:观察者1被提醒  观察者2被提醒

 

下面咱们根据以上的机制,开始做架构

由于只有两个角色:观察者以及主题,他们为了达到上述机制,必须都要遵照相同的协议,也就是接口,所以我们先来做两个接口

 

观察者接口:

 

interface IReciver

{

 

void AddSubject(ISubject Subject);//观察者可以与主题建立联系,所以要有这个方法

         void DeleteSubject(ISubject Subject);//观察者可以与主题取消联系,所以要有这个方法

void UpdateStatue();//观察者被提醒时,由主题来发出提醒消息,需要调用每一个观察者的这个相应提醒的方法

 

}

 

 

 

通过定义一个观察者抽象类,完成模式固有的功能

 

 

abstract class AReciver:IReciver//实现IReciver接口

     {

 

         abstract public void UpdateStatue();//由于是超类,无法得知每一个具体的观察着在接到主题的通知后要做什么,所以,还是声明称abstract,留给继承者去实现吧

 

         public void AddSubject(ISubject Subject)//与主题建立关联

         {

             Subject.AddReciver(this);//将自己添加到主题的联系人列表里面去

         }

 

         public void DeleteSubject(ISubject Subject)//与主题取消关联

         {

             Subject.DeleteReciver(this);//将自己从主题的联系人列表里面去除

         }

     }

 


主题接口:

 

 

interface ISubject

     {

       void AddReciver(IReciver Reciver);//当观察者与此主题建立联系时,将此观察者添加到联系人列表里面去

         void DeleteReciver(IReciver Reciver);//当观察者与此主题删除联系时,将此观察者从联系人列表里面去处

         void NotifyReciver();//调用观察者的  响应提醒()方法,达到提醒的效果

     }

 

 

        通过定义一个主题抽象类,完成模式固有的功能


 

     abstract class ASubject:ISubject

     {

         List<IReciver> ReciverList = new List<IReciver>();//联系人列表,以便通知观察者时使用

 

 

         public void AddReciver(IReciver Reciver)//添加观察者到联系人列表

         {

             ReciverList.Add(Reciver);

         }

 

         public void DeleteReciver(IReciver Reciver)//删除观察者从联系人列表

         {

             ReciverList.Remove(Reciver);

         }

 

         public void NotifyReciver()//循环提醒每一个观察者

         {

             foreach (IReciver TmpReciver in ReciverList)

             {

                 TmpReciver.UpdateStatue();

             }

         }

     }

 

调用:

 

CSubject Subject1 = new CSubject(); CSubject Subject2 = new CSubject(); CReciver Reciver1 = new CReciver(); CReciver Reciver2 = new CReciver(); CReciver Reciver3 = new CReciver(); Reciver1.ReciverName = "Reciver1"; Reciver2.ReciverName = "Reciver2"; Reciver3.ReciverName = "Reciver3"; Reciver1.AddSubject(Subject1); Reciver2.AddSubject(Subject1); Reciver3.AddSubject(Subject2); Subject1.NotifyMessage();

Subject2.NotifyMessage();

 

结果就是reciver1,2,3都被提醒了,如果将Subject2.NotifyMessage();注释掉,那么结果就会变为reciver1,2被提醒

 

上述代码就是基本的观察者模式,至于观察者模式的应用,这个无法举例,如果你经常参加实战,肯定有地方会用到这种机制,如果没有机会实践,只是学学而以,那么了解这些就足够了

写累了,先写这么多,如果有疑问就直接给我留言吧,我再会给与详细解释

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值