分析&回答
观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖它的对象都会得到通知,并被自动更新,
系统中有两个方面,其中一个方面依赖与另一个方面,我们把这两个方面抽象,是各自可以独立的变化和复用。
就像我们现在所用到的分层,不就是一层层的依赖么?还有系统组件升级,系统功能也跟着变化,这也属于观察者模式。
实例代码讲解:
/**
* 抽象观察类
*/
abstract public class Observer{
public abstract void Update();
}
/**
* 具体观察类
*/
public class Concreteobserver:Observer{
private string name;
private string observerState;
private ConcreteSubject subject;
public Concreteobserver(ConcreteSubject subject,string name){
this.subject=subject;
this.name= name;
}
public override void Update(){
observerState=subject.GetState();
Console.write("观察者{0}的新状态是{1}",name,observerState);
}
}
/**
* 抽象主题类
*/
abstract public class Subject(){
private List<observer> observers = new List<observer>() ;
public void Attach(Observer observer){
observers.Add(Observer);
}
public void Detach(Observer Observer){
observers.Remove(Observer);
}
public void NotifyObservers(){
foreach(Observer o in observers){
o.Update();
}
}
}
/**
* 具体主题类
*/
public class ConcreteSubject:Subject{
private string subjectState;
public string SubjectState{
get{return subjectstate;}
set{subjectstrate=value;}
}
public void GetState(){
return subjectstate;
}
}
/**
* client端
* @param args
*/
static void Main(string[] args)
{
ConcreteSubject c = new ConcreteSubject();
Concreteobserver o1 = new Concreteobserver(c,"X");
Concreteobserver o2 = new Concreteobserver(c,"Y");
Concreteobserver o3 = new Concreteobserver((c,"Z");
c.Attach(o1);
c.Attach(o2);
c.Attach(o3);
c.subjectstate="abc";
c.Nofify();
Console.ReadLine();
}
反思&扩展
喵呜面试助手: 一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!