敲完观察者模式后,有一种回到高中的感觉,为什么呢?接下来由我为大家细细道来。
本文章要告诉大家的知识:
1.什么是观察者模式
2.为什么要用观察者模式(好处)
3.我的高中生活
首先让我们来说道说道什么是观察者模式。
观察者模式:又叫发布-订阅模式。定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时候,会通知所有的观察者对象,使它们能够自动的更新自己。
一些通俗的理解就是——抗战时期给日本做汉奸的人们,还有掌握重要情报的间谍们。以及发展到现在的处在老师与同学之间的“情报员”。哈哈哈想想确实挺有趣的。
现在我们就用一张图来表示一下:
这张图看上去很抽象,其实与具体的实例结合很好理解的。就是通风报信的人是一类,接受着实一类。不管是观察的对象,还是通风报信的人都有一个特征就是身上都携带着信息,这个信息正好是观察者要用的,所以把这个抽象出一个抽象类即信息类。还有一类人就是观察者,他要通过“情报员”给自己的信息来调整自己的状态,来装老师眼中的”好学生“。不知这样讲解您是否理解了。
其次我们来说一下为什么要使用观察者模式。
当一个对象的改变需要同时改变其他对象,同时它也不知道具体有多少对象要改变的时候,应该用观察者模式。专业昂一个抽象模型由两个方面,其中一方面依赖于另一方面,这是用观察者模式可以将这两者缝扎ungzai独立的对象中使它们各自独立地改变和复用。
这样观察者模式所做的工作就是在解耦合。让耦合双方都依赖于抽象。而不是依赖于具体。从而使得一方面的棉花都不会影响另一方面的变化。同时这就是依赖倒转原则的体现与运用。
我的高中生活。
讲了这么多理论,想必看都要看哭了!接下来 为大家讲个有意思的事情——我的高中生活。
高中三年,风风雨雨,每天无时无刻不在和老师和困意战斗着。上次自考的时候在一中发现了很好玩的一件事,教室前边们没玻璃,只有后边有那么一小条玻璃。哈哈哈哈哈。感觉好悲惨,老师真狠。然后又想到了我的高中生活。每天高中忙在题海中,偶尔的放松一下也是允许自己的,但是有害怕被老师看到,所以呢。周围约定好这周谁负责情报,下周谁负责。这样我们这些偷懒的”好学生“就开始传纸条,看小说,说小话,吃点小零食。这时候老师突然来了,间谍就开始通知了,然后我们便回复正常的状态,这样一次次的成为老师眼中的”好学生“!
现在我们来吧这个写成一个观察者模式的例子:
interface Subject //不管是谁通知,他们可以同为一个接口,让老板或者秘书来实现这个借口就可以了
{
void Attach(Observe observe);
void Detach(Observe observe);
void Notify();
string SubjectState
{
get;
set;
}
}
class Boss : Subject
{
private IList<Observe> observes = new List<Observe>(); //增加要通知的人员列个单子
private string action;
public void Attach(Observe observe)
{
observes.Add(observe);
}
public void Detach(Observe observe)
{
observes.Remove(observe);
}
public void Notify()
{
foreach (Observe o in observes)
o.Update();
}
public string SubjectState
{
get { return action; }
set { action = value; }
}
}
abstract class Observe
{
protected string name;
protected Subject sub;
public Observe(string name, Subject sub)
{
this.name = name;
this.sub = sub;
}
public abstract void Update();
}
class StockObserve : Observe
{
public StockObserve(string name, Subject sub)
: base(name, sub)
{ }
public override void Update()
{
Console.WriteLine("{0} {1} 藏起小说,拿出数学卷子", sub.SubjectState, name);
}
}
class NBAObserve : Observe
{
public NBAObserve(string name, Subject sub)
: base(name, sub)
{ }
public override void Update()
{
Console.WriteLine("{0}{1} 收起零食,拿出英语卷子,学习!", sub.SubjectState, name);
}
}
static void Main(string[] args)
{
Boss Li = new Boss();
StockObserve A = new StockObserve("小李子", Li);
NBAObserve B = new NBAObserve("小扇子", Li);
Li.Attach(A);
Li.Detach(B);
Li.SubjectState = "李老师在后门看!!"; //注意代码的逻辑先写那一部分再写那一部分
Li.Notify();
Console.Read();
}
这里的小扇子没有被通知到,很稀罕他被忽视了,所以他就自认倒霉吧!!关于上边的例子大家应该都经历过,因为我们都是“好学生”!!