设计模式-观察者模式(Observer Pattern)

上一篇 <<<装饰模式(Decorator Pattern)
下一篇 >>>单例模式(Singleton Pattern)


观察者模式:定义了对象间的一种一对多依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。

应用场景

  • Spring的Event监听
  • 订单成功后的邮件短信及活动发放
  • 分布式配置中心刷新配置
  • Zookeeper事件通知节点
  • 消息订阅通知
  • 安卓开发事件注册

责任链与观察者模式区别

责任链 有严格顺序、多个观察者(没有顺序要求)

JDK自带的观察者

Jdk中Observable 与ObServer区别
ObServer是观察者,Observable是被观察者,也称之为主题。
被观察者发生变化时通知观察者,观察者会跟着变动。

/**
 * 观察者
 */
public class EmailObServer implements Observer {

    public void update(Observable o, Object arg) {
        // 1.获取主题
        MessageObServable messageObServable = (MessageObServable) o;
        System.out.println("发送邮件内容:" + arg);
    }
}
/**
 * 被观察者
 */
public class MessageObServable extends Observable {

    @Override
    public void notifyObservers(Object arg) {
        // 1.改变数据
        setChanged();
        // 2.通知所有的观察者改变
        super.notifyObservers(arg);
    }
}
/**
 * 测试代码
 *
 */
public class JdkObServer {
    public static void main(String[] args) {
        //1.创建主题
        MessageObServable messageObServable = new MessageObServable();
        // 2.添加订阅者
        messageObServable.addObserver(new EmailObServer());
        messageObServable.addObserver(new SmsObServer());
        // 3.组装消息内容
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("email", "12345678@qq.com");
        jsonObject.put("phone", "13012341234");
        messageObServable.notifyObservers(jsonObject.toJSONString());
    }
}

Spring的Event监听

//邮件观察者
@Component
public class EmailListener implements ApplicationListener<OrderCreateEvent> {
    @Override
    @Async
    public void onApplicationEvent(OrderCreateEvent event) {
        System.out.println(Thread.currentThread().getName()+"发送邮件内容:" + event.getJsonObject().toJSONString());
    }
}
//被观察者
public class OrderCreateEvent extends ApplicationEvent {
    private JSONObject jsonObject;

    public OrderCreateEvent(Object source, JSONObject jsonObject) {
        super(source);
        this.jsonObject = jsonObject;
    }
}
/测试代码,利用上下文自动监听通知
@RestController
public class TestController {
    @Autowired
    private ApplicationContext applicationContext;

    @RequestMapping("/addOrder")
    public String addOrder() {
        System.out.println("创建订单...");
        // 3.组装消息内容
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("email", "123456@qq.com");
        jsonObject.put("phone", "13012341234");
        OrderCreateEvent orderCreateEvent = new OrderCreateEvent(this, jsonObject);
        applicationContext.publishEvent(orderCreateEvent);
        return "success";
    }
}

纯手写核心代码

/**
 * 自动注册我们观察者
 *
 * 1.使用Spring获取该ObServer下有那些bean对象
 * 2.直接注添加到集合中
 *
 */
//根据接口类型返回相应的所有bean
Map<String, ObServer> map = applicationContext.getBeansOfType(ObServer.class);
for (String key : map.keySet()) {
    ObServer obServer = map.get(key);
    jaryeSubject.addObServer(obServer);
}
/**
 * 新增ObServer
 *
 * @param obServer
 */
public void addObServer(ObServer obServer) {
    listObServer.add(obServer);
}

/**
 * 通知给所有的观察者
 *
 * @param jsonObject
 */
public void notifyObServer(JSONObject jsonObject) {
    for (ObServer obServer :
            listObServer) {
        // 单独开启线程异步通知
        executorService.execute(new Runnable() {
            @Override
            public void run() {
                obServer.sendMsg(jsonObject);
            }
        });

    }
}

相关文章链接:
<<<23种常用设计模式总览
<<<代理模式(Proxy Pattern)
<<<装饰模式(Decorator Pattern)
<<<单例模式(Singleton Pattern)
<<<责任链模式(Chain of Responsibility Pattern)
<<<策略模式(Strategy Pattern)
<<<模板方法模式(Template Pattern)
<<<外观/门面模式(Facade Pattern)
<<<建造者模式(Builder Pattern)
<<<适配器模式(Adapter Pattern)
<<<原型模式(Prototype Pattern)
<<<工厂相关模式(Factory Pattern)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容