笔记-观察者模式

观察者模式目的:
当一个对象的状态发生改变时,已经登记的其他对象能够观察到这一改变从而作出自己相对应的改变。通过这种方式来达到减少依赖关系,解耦合的作用。
相关链接:

https://mp.weixin.qq.com/s?__biz=MzAwNDA2OTM1Ng==&mid=2453152034&idx=1&sn=1e1db22c4a7cb2bfcc4a7ce141a9ef00&chksm=8cfd03a1bb8a8ab75c824b6866b1960485276f1dae410567d917bd0be71e4d071ab146e147cd&scene=178&cur_album_id=1761987817540206592#rd

简单来说就是先将观察者放进一个主题队列,再调用发送消息方法,循环调用每个观察者的处理方法。

示例代码:

private static ExecutorService executorService = Executors.newFixedThreadPool(5);

public static void main(String[] args) {
    List<String> users = new ArrayList<>();
    //模拟多个用户注册成功后,异步进行新人福利发放和短信通知,一般用消息队列做通知,这里用观察者模式实现
    for (int i = 0; i < 5; i++) {
        String userid = String.valueOf(i);
        users.add(userid);
        System.out.println(userid + "注册成功");
        executorService.submit(new Runnable() {
            @Override
            public void run() {
                //将福利发放和短信通知添加进observice的list中,后续有其他操作再添加即可
                ComCreateSubject comCreateSubject = new ComCreateSubject();
                pushObservice(comCreateSubject);
                //发送消息之后,就可以做其他事
                comCreateSubject.sendMessage(userid);
            }
        });
    }

}

private static List<Observice> pushObservice(ComCreateSubject comCreateSubject) {
    comCreateSubject.attach(new sendCard());
    comCreateSubject.attach(new sendMessage());
    return comCreateSubject.getObservice();
}

定义一个subject,添加,删除,发送消息给观察者等方法的接口

public interface subject {

    public void attach(Observice observice);

    public void remove(Observice observice);

    public void sendMessage(String userid);

    public List<Observice> getObservice();
}

实现subject

public class ComCreateSubject implements subject {

    private List<Observice> observices = new ArrayList<>();

    @Override
    public void attach(Observice observice) {
        observices.add(observice);
    }

    @Override
    public void remove(Observice observice) {
        observices.remove(observice);
    }

    @Override
    public void sendMessage(String userid) {
            for (Observice observice : observices) {
                observice.deal(userid);
            }
    }

    @Override
    public List<Observice> getObservice() {
        return observices;
    }
}

定义观察者方法的接口

public interface Observice {

    public void deal(String userid);
}

具体的某个观察者

public class sendCard implements Observice {

    public void deal(String userid) {
        try {
            // 模拟服务调用 线程睡1秒钟
            TimeUnit.SECONDS.sleep(1);
            System.out.println(userid + "发送优惠卷");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
}
public class sendMessage implements Observice{

    public void deal(String userid) {
        try {
            // 模拟服务调用 线程睡1秒钟
            TimeUnit.SECONDS.sleep(1);
            System.out.println(userid + "发送短信");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值