观察者模式

cocos2dx观察者模式

匿名 (未验证) 提交于 2019-12-03 00:22:01
开始 第一次运行 #ifndef EventListenerCustomTest_hpp #define EventListenerCustomTest_hpp #include <stdio.h> #include "cocos2d.h" USING_NS_CC ; #include "cocostudio/CocoStudio.h" #include "ui/CocosGUI.h" using namespace cocos2d :: ui ; class EventCustomTest : public Layer { public : static Scene * createScene(); bool init(); CREATE_FUNC ( EventCustomTest ); Text * statusLabel; }; #endif /* EventListenerCustomTest_hpp */ // // // // #include "EventListenerCustomTest.hpp" Scene * EventCustomTest ::createScene() { auto scene = Scene :: create (); auto layer = EventCustomTest :: create (); addChild (layer)

责任链模式和观察者模式

匿名 (未验证) 提交于 2019-12-03 00:22:01
责任链模式 避免请求发送者与接收者耦合在一起,让多个对象都有可能接受请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 通过下面例子,当办公室失火,会通知仓库的保安,保安会通知整个大楼。 抽象区域: public abstract class Zone{ private Zone parentName; private String localName; public Zone(String name) { localName = name; } public void setParentName(Zone parentName) { this.parentName = parentName; } public void notifyPare() { if(parentName != null) { parentName.notifyPare(); return; } dosomething(); } abstract void dosomething(); } 具体实现类: /** * 办公室 * @author jiahua * */ public class Office extends Zone { public Office(String name) { super(name); } @Override void dosomething() {

错误日志之观察者模式

匿名 (未验证) 提交于 2019-12-02 23:57:01
星期一 情景 早晨,项目组长来到小明身边,“有人反映咱们的项目有Bug” “什么Bug?” “不知道,你添加一个日志模块自己看记录去。” ”...“ 分析 在MVC全局过滤器中自己添加有异常过滤器。 Global.asax 1 public class MvcApplication : System . Web . HttpApplication 2 { 3 protected void Application_Start () 4 { 5 AreaRegistration . RegisterAllAreas (); 6 //注册全局过滤器 7 FilterConfig . RegisterGlobalFilters ( GlobalFilters . Filters ); 8 RouteConfig . RegisterRoutes ( RouteTable . Routes ); 9 BundleConfig . RegisterBundles ( BundleTable . Bundles ); 10 } 11 } View Code FilterConfig.cs 1 public class FilterConfig 2 { 3 public static void RegisterGlobalFilters ( GlobalFilterCollection

观察者模式

匿名 (未验证) 提交于 2019-12-02 23:47:01
一、模式名 观察者模式, Observer 二、解决的问题 观察者模式,从模式名字上就可以看出该模式的功能,即观察某个对象的状态。换一中表述,可能对观察者会有更加清楚的了解,即订阅发布模式,被观察对象在状态变化时显式地通知观察对象,这种协作关系和发布订阅比较类似。被观察对象可以看作为消息的生产者,而观察对象即为消息的消费者。 观察者模式的优点就是在被观察对象状态变化时能够通知观察对象,实现被观察对象和观察对象的解耦。 三、解决方案 观察者模式的UML图如下所示 示例代码如下: public class ObserverExer { public static void main(String[] args) { Observable observable = new ConcreteObservable(); Observer mqObserver = new MqObserver(); DbObserver dbObserver = new DbObserver(); observable.addObserver(mqObserver); observable.addObserver(dbObserver); observable.change(); } } abstract class Observable { private List < Observer >

spring 中常用的设计模式

匿名 (未验证) 提交于 2019-12-02 23:34:01
一、 Spring 中常见的设计模式 工厂模式 : BeanFactory 装饰器模式: BeanWrapper 代理模式: AopProxy 单例模式: ApplicationContext 委派模式: DispatcherServlet 策略模式: HandlerMapping 适配器模式: HandlerApdapter 模板方法模式: JdbcTemplate 观察者模式: ContextLoaderListener 二、Spring 的四大模块及典型的 设计模式   4、Spring JDBC 模板方法模式

观察者模式(Observer Pattern)

匿名 (未验证) 提交于 2019-12-02 23:04:42
是什么? 怎么用? 什么情况下用? 实例! 观察者模式:   一个目标对象管理所有依赖于它的观察者对象,并且当它本身的状态改变时主动发出通知。   这时候就有问题了,目标怎么知道谁是观察者?谁不是观察者?而且目标要怎么通知观察者?   (个人感觉两个类通信就能用到这东西) 使用场景:   今日头条文章发布后需要一系列的后续处理流程,比如更新这个作者创建的文章总数、将这篇文章推荐到对应的频道、划分文章的栏目、上报到推荐系统等等。那要其他的这些要怎么知道文章是否发布呢?这时候就可以用到观察者模式了(事件机制)! 原理:   目标类需要:     1、注册观察者(观察者通知目标:我要当你的观察者)     2、移除观察者(观察者通知目标:我要溜了)     3、调用观察者的提供的方法通知观察者   观察者需要:     1、提供目标通知观察者时用到的方法     2、在构造函数中调用目标的注册方法将自己注册成目标的观察者 例子:   气象检测例子:      如图,气象站是获取实际气象数据的物理设备,WeatherData对象是用来追踪气象站的数据,并更新布告板。      扩充WeatherData对象,使得布告板能够及时更新,并利于以后的扩展。        Subject 是抽象目标,所有的目标都继承这个抽象类,这个抽象类提供了三个最基本的注册、移除、通知观察者的方法!  

设计模式――观察者模式

匿名 (未验证) 提交于 2019-12-02 22:06:11
慢慢的做记录,做最强大的自己 看了大话设计模式之后感触很深,发现自己还有很多学习的东西,设计软件并不是一两句代码把功能写完了就行,需要思考的内容有很多 代码来源参考大话设计模式这本书,这里在博客里记录一下,不可能每次都去翻书,但是在博客里面是非常好找的。 观察者模式(Observer) 算是设计模式里面最经典的一个模式了,这个模式可以应用在业务逻辑处理与界面交互的过程中,官方解释就是在此种模式中, 一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。 举一个简单的例子,之前看到的面试题: 猫看见很多老鼠在偷米吃,大叫了一声,主人醒了,这就是一个经典的观察者模式,老鼠跟主人都是观察者(Observer),而猫是一个被观察者(Subject) 之前我同事还给我举了一个例子:项目经理,前台妹纸,还有科室成员,怎么防止项目经理突然间在同事都在做非工作上的事情时,提前预知,那么就需要前台妹纸去观察了。 那么怎么去实现观察者模式呢,那就是把观察者当一个整体给抽象出来。 就以猫遇见老鼠叫主人被惊醒这个为例子: public interface Observer { void Response(); //观察者的响应,如是老鼠见到猫的反映 } public interface Subject

ES6入门系列 ----- 使用Proxy 实现观察者模式

匿名 (未验证) 提交于 2019-12-02 21:53:52
    观察者模式是指函数自动观察数据对象的变化, 一旦对象有变化,函数就会自动执行。 它定义了一种一对多的依赖关系,我们用Proxy来实现一个简单的观察者模式(PS: 初学我们认为 观察者模式 == 发布订阅模式, 其实它们有点不同)。     例子: const callbacks = new Set();const observe = fn => callbacks.add(fn);const observable = obj => new Proxy(obj, {set});function set (target, key, value, receiver) { const result = Reflect.set(target, key, value, receiver); callbacks.forEach(observe => observe()); return result;}// 一个可观察的对象const person = observable({name: 'liu', age: 18});function change() { console.log(`${person.name} is ${person.age}`);}observe(change);person.age = 19; 首先定义了一个observe 用来存储 要触发的函数。

观察者模式和发布订阅模式(下)

匿名 (未验证) 提交于 2019-12-02 21:53:52
前一篇对观察者模式做了介绍,重点在于观察者和被观察者的对应关系,以及将被观察者的改变及时通知到相对应的观察者。 这样的模式基本上可以解决少量数据源的情景,在观察者和被观察者可能是多对多关系的情况下,强耦合的结构会让代码不够清晰,难以维护。 在《JavaScript设计模式》一书中,提到了Observer和Publish/Subscribe的区别。 Observer模式要求希望接收到主题同志的观察者(或对象)必须订阅内容改变的事件。 Publish/Subscribe模式使用了一个主题/事件通道,这个通道介于希望接收到通知(订阅者)的对象和激活事件的对象(发布者)之间。该事件系统允许代码定义应用程序的特定事件,这些事件可以传递自定义参数,自定义参数包含订阅者所需的值。其目的是避免订阅者和发布者之间产生依赖关系。 这里的关键点在于,通过一个事件中心,将发布者和订阅者的耦合关系解开,发布者和订阅者通过事件中心来产生联系。 打个比方,发布者像是发布小广告的,事件中心是一个调度站,订阅者则告诉事件中心,我关注A、B类型的广告,如果有更新,请通知我。调度站记录A,B类型下的订阅者,等到A,B广告发布时,通知到订阅者。 这个例子里,发布者不关心订阅者是谁,也不维护订阅者列表,同订阅者解耦,只将自己发布的内容提交到事件中心。而订阅者和主题的关系,交给了事件中心来维护。

观察者模式 ―― java.util.Observable 源码学习

匿名 (未验证) 提交于 2019-12-02 21:52:03
学习观察者模式,结合JavaJDK的内置观察者模式代码一起学习 package java.util; //不是抽象类,也不是接口public class Observable { private boolean changed = false; //状态标志 private Vector<Observer> obs; //储存观察者的集合引用 public Observable() { obs = new Vector<>(); //构造函数中构建空的集合 } /*增加观察者*/ public synchronized void addObserver(Observer o) { if (o == null) // 判空 throw new NullPointerException(); if (!obs.contains(o)) { //不重复 obs.addElement(o); } } /*删除一个被观察者*/ public synchronized void deleteObserver(Observer o) { obs.removeElement(o); } /**/ public void notifyObservers() { notifyObservers(null); } /*向所有注册的观察者发送更新通知,参数是更新的信息  */ public void