java设计模式系列之《二》----- 观察者模式

本文深入解析观察者模式,通过微信推送消息的实例,详细说明了观察者与被观察者之间的关系,展示了如何实现一对多的消息订阅与发布机制。

观察者模式主要就是说观察者与被观察者之间的关系,通常是一个被观察者被多个观察者观察,一对多的关系!

举例:被观察者可以理解为微信,观察者自然就是微信用户。

1>定义被观察者接口:

/**
 * 功能描述: 被观察者(微信)
 * @date: 2019/7/31
 */
public interface ObserverNo {

    /**
     * 功能描述: 微信可以添加用户
     */
    void addObserver(Observer observer);

    /**
     * 功能描述: 微信可以删除用户
     */
    void delObserver(Observer observer);

    /**
     * 功能描述: 微信可以群发消息推送
     */
    void notifyAllServer(String message);

}

2>定义观察者接口:

/**
 * 功能描述: 观察者(微信用户)
 * @date: 2019/7/31
 */
public interface Observer {

    /**
     * 功能描述: 通知
     */
    void update(String message);
}

3>定义被观察者实现类--微信:

/**
 * 功能描述: 微信
 */
@Data
@Slf4j
public class Wechat implements ObserverNo {

    private List<Observer> observers;
    private String Message;

    public Wechat() {
        observers = new ArrayList<>();
    }

    @Override
    public void addObserver(Observer observer) {
          observers.add(observer);
    }

    @Override
    public void delObserver(Observer observer) {
        log.info("移除一个用户");
        observers.remove(observer);
    }

    @Override
    public void notifyAllServer(String message) {
        log.info("微信开始推送统一消息");
        observers.forEach(observer -> {
            observer.update(message);
        });
    }
}

4>定义观察者实现类--微信用户:

/**
 * 功能描述: 微信用户
 */
@Data
@Slf4j
public class WechatUser implements Observer {

    private String name;

    public WechatUser(String name) {
        log.info("微信用户:"+name+"  被创建");
        this.name = name;
    }

    @Override
    public void update(String message) {
        log.info("微信用户:"+name+"  接收到推送消息:"+message);
    }
}

5>测试类:

public class Test {

    public static void main(String[] args) {
        Wechat server = new Wechat();

        Observer userZhang = new WechatUser("张三");
        Observer userLi = new WechatUser("李四");
        Observer userWang = new WechatUser("王老板");

        server.addObserver(userZhang);
        server.addObserver(userLi);
        server.addObserver(userWang);
        server.notifyAllServer("今日毒鸡汤:如果你不努力,就不知道什么叫绝望!");

        System.out.println("----------------------------------------------");
        server.delObserver(userZhang);
        server.notifyAllServer("今日毒鸡汤:比你优秀的人都在努力,那你努力还有什么用呢?");

    }
}

测试结果:

09:57:28.180 [main] INFO com.he.hsdyc.designmodule.observer.WechatUser - 微信用户:张三  被创建
09:57:28.180 [main] INFO com.he.hsdyc.designmodule.observer.WechatUser - 微信用户:李四  被创建
09:57:28.180 [main] INFO com.he.hsdyc.designmodule.observer.WechatUser - 微信用户:王老板  被创建
09:57:28.180 [main] INFO com.he.hsdyc.designmodule.observer.Wechat - 微信开始推送统一消息
09:57:28.221 [main] INFO com.he.hsdyc.designmodule.observer.WechatUser - 微信用户:张三  接收到推送消息:今日毒鸡汤:如果你不努力,就不知道什么叫绝望!
09:57:28.221 [main] INFO com.he.hsdyc.designmodule.observer.WechatUser - 微信用户:李四  接收到推送消息:今日毒鸡汤:如果你不努力,就不知道什么叫绝望!
09:57:28.221 [main] INFO com.he.hsdyc.designmodule.observer.WechatUser - 微信用户:王老板  接收到推送消息:今日毒鸡汤:如果你不努力,就不知道什么叫绝望!
----------------------------------------------
09:57:28.222 [main] INFO com.he.hsdyc.designmodule.observer.Wechat - 移除一个用户
09:57:28.222 [main] INFO com.he.hsdyc.designmodule.observer.Wechat - 微信开始推送统一消息
09:57:28.222 [main] INFO com.he.hsdyc.designmodule.observer.WechatUser - 微信用户:李四  接收到推送消息:今日毒鸡汤:比你优秀的人都在努力,那你努力还有什么用呢?
09:57:28.222 [main] INFO com.he.hsdyc.designmodule.observer.WechatUser - 微信用户:王老板  接收到推送消息:今日毒鸡汤:比你优秀的人都在努力,那你努力还有什么用呢?

其实就是一个消息的订阅,微信推送其实就是这个原理,包括一些支付的回调方法啊都是这样!

 

上面的例子可能不是太通俗,我举个通俗点的例---城管与小贩

在俺们老家小镇有这样一个人,玉树临风,帅的一批,它的职业是城管(被观察者),对他的评价就一个字:优秀的秀!

手底下掌管着五十来号小贩(观察者),有卖手抓饼的,有卖狗不理的,还有波霸奶茶...

大家都偷偷的观察着帅气的城管大大,看到城管大大不经意的嘴角上扬,大家的心里都安定了稍许

我们的城管大大有三大法宝:让你来神水(addObserver),让你滚之剑(delObserver)以及通知大广播(notifyAllServer)!

我们的小贩只有一件生活必备用品:接收广播大耳机(update)

当我们的城管大大开心的时候会赐给新来的小贩“让你来神水”,这就意味着城管大大以后罩着你了,那感觉,不要不要的!(被观察者添加观察者,建立关系)

有一天,卖狗不理的小贩看到帅气的城管大大迎面走来,顿感心花怒放,心想:一定是城管大大看上我了,妈呀,太幸运了!不对啊,差点忘记我是男的,哎,空欢喜一场。这时小贩不知道看到了啥,对着城管大大就是一顿吼:狗,狗,狗

城管大大不屑一顾的瞅了一眼:都结巴了,看到俺这么激动吗?也是,帅也是一种烦恼

突然间,咚的一声,大大掉沟了!小贩赶紧说道:城管大大,不惯我事啊,我刚才都。

大大不紧不慢的起身,拍了拍屁股,对着小贩做了一个嘘的手势:憋说话,吻我,不对,你给我狗带!一把抽出了让你滚之剑

从此小镇,再无狗不理!!!(被观察者移除观察者,解除关系)

片刻后,城管大大掏出了,哦不,拿出了随身的通知大广播,开始了平日的例行鸡汤:大家不要急,你们都还年轻,现在没钱算什么?算什么?以后没钱的日子还多着哩!嘿嘿嘿(被观察者统一推送消息)

与此同时,所有被城管大大罩着的小贩,都通过随身的接收广播大耳机收到了大大的发言,暗叹一声:真有道理哩

而狗不理小贩再也听不到这样的至理名言!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值