public static void Main(string[] args) { var boss = new Boss(); var stockObserver = new StockObserver("魏关姹", boss); var nbaObserver = new NBAObserver("易管查", boss); boss.Attact(stockObserver); boss.Attact(nbaObserver); boss.Detach(stockObserver); boss.SubjectState = "老板我胡汉三回来了"; boss.Notify(); Console.WriteLine(); var newBoss = new NewBoss(); // 通过事件来通知的新老板 var gameObserver = new GamePlayerObserver("西门", newBoss); // 注册通知事件 newBoss.Update += stockObserver.Update; newBoss.Update += nbaObserver.Update; newBoss.Update += gameObserver.CloseGame; newBoss.SubjectState = "老板我胡汉三回来了"; newBoss.Notify(); Console.ReadLine(); }
static void Main(string[] args) { /*使用观察者模式实现:boss回来了,告知大家 * Subject boss = new Boss(); * Observer colleague1 = new StockObserver("Zhangxing", boss); * Observer colleague2 = new NBAObserver("Zhangyi", boss); * boss.Attach(colleague1); * boss.Attach(colleague2); * boss.SubjectState = "boss回来了,大家开会"; * boss.Notify(); * */ /* 观察者模式模板 * Subject sub = new ConcreteSubject(); * Observer observer = new ConcreteObserver(sub,"Zhangxing"); * sub.Attach(observer); * sub.SubjectState = "状态改变了"; * sub.Notify(); * */ /*观察者模式&事件托管实现:boss回来了,告知大家*/ Subject boss = new Boss(); Observer colleague1 = new StockObserver("Zhangxing", boss); Observer colleague2 = new NBAObserver("Zhangyi", boss); boss.Update += new EventHandle(colleague1.Update); boss.Update += new EventHandle(colleague2.Update); boss.SubjectState = "boss回来了,大家开会"; boss.Notify(); Console.Read(); }
static void Main(string[] args) { Boss huhansan = new Boss(); StockObserver tongshi1 = new StockObserver("李峰", huhansan); NBAObserver tongshi2 = new NBAObserver("程冰冰", huhansan); huhansan.Update += new EventHandler(tongshi1.CloseStockMarket); huhansan.Update += new EventHandler(tongshi2.CloseNBADirectSeeding); huhansan.SubjectState = "我胡汉三回来了"; huhansan.Notify(); }
static void Main(string[] args) { Secretary qt = new Secretary(); StockObserver ts1 = new StockObserver("one", qt); Observer ts2 = new NBAObserver("two", qt); qt.Update += new EventHandler(ts1.Update); qt.Update += new EventHandler(ts2.Update); qt.SecretaryAction = "come back"; //qt.Notify2(); //qt.Attach(ts1); //qt.Attach(ts2); qt.Notify(); Console.Read(); }
static void Main(string[] args) { //观察者模式:观察者模式也叫发布订阅模式,观察者模式建立了一种一对多的依赖关系, //让多个观察者对象同时监听同一个主题的对象,这个主题对象在发生改变时会通知所有的观察者, //使他们能够自动更新自己。 //介绍 //意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 //主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。 //何时使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。 //如何解决:使用面向对象技术,可以将这种依赖关系弱化。 //关键代码:在抽象类里有一个 ArrayList 存放观察者们。 //应用实例: 1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。 2、西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟就是观察者,他观察菩萨洒水这个动作。 //优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。 //缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。 //使用场景: //一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。 //一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。 //一个对象必须通知其他对象,而并不知道这些对象是谁。 //需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象……,可以使用观察者模式创建一种链式触发机制。 //注意事项: 避免循环引用、如果顺序执行,某一观察者错误会导致系统卡壳,一般采用异步方式。 #region 观察者模式 var subject = new ConcreteSubject(); subject.SubjectState = "ABC"; var observerA = new ConcreteObserver("A", subject); var observerB = new ConcreteObserver("B", subject); subject.Attach(observerA); subject.Attach(observerB); subject.Notify(); var bossSubject = new BossSubject(); bossSubject.SubjectState = "老板来了。。。"; var stockObserver = new StockObserver("大刘", bossSubject); var nbaObserver = new NBAObserver("小王", bossSubject); bossSubject.Update += stockObserver.Update; bossSubject.Update += nbaObserver.Update; bossSubject.Notify(); Console.ReadLine(); #endregion }