学习使用设计模式也有一段时间了,苦于当初没有分享到太好的心得,所以其间遇到不少困难,也走了很多弯路,磕磕绊绊到现在使用设计模式已经略懂一二,不敢私藏,分享给正在学习设计模式且为之苦恼的同学。
设计模式,其实没有那么可怕,学习每一个设计模式的时候,学习重点其实不是看懂其代码,设计模式的精髓也不只是那些代码,而是思想,思路;那些代码充其量也只是思路的实现而以,所以我们在学习一个新的设计模式的时候,需要先弄清楚,到底每一个模式都有什么样的机制,用的是什么样的思路,然后,先自己按照这个思路,写一个雏形,再看看到底自己写的与标准的做法有何不同,这样学习,能够达到立竿见影的效果。
我们开始介绍第一个模式:观察者模式
我先讲讲观察者这个模式是做什么用的,所谓观察者模式(我们可以忘记这个名字,管他叫什么都没有关系,我们关注的是机制),要达到的效果是这样的:
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被提醒
上述代码就是基本的观察者模式,至于观察者模式的应用,这个无法举例,如果你经常参加实战,肯定有地方会用到这种机制,如果没有机会实践,只是学学而以,那么了解这些就足够了
写累了,先写这么多,如果有疑问就直接给我留言吧,我再会给与详细解释