设计模式-观察者模式

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。

以下属于个人理解,如有错误敬请指正

应用场景:

1.用户信息变更后,系统发送通知消息给用户包含短信通知,邮件通知
2.用户银行卡余额变更,系统发送通微信、短信、以及app推送等

实现方式:
  • 定义观察目标接口 Subject
  • 定义具体观察目标实现 UserPhoneSubject
  • 定义观察者接口 Observer
  • 定义具体观察者实现 WeChatMessage EmailMessage(两个观察者)
  • 最后定义一个发布类 ContextPublish
//观察目标接口
public interface Subject {
    /**
     * @method attach
     * @description: 添加观察者
     */
    void attach(Observer observer);

    /**
     * @method detach
     * @description: 删除观察者
     * @param observer
     * @return void
     */
    void detach(Observer observer);

    /**
     * @method notify
     * @description: 给观察者传递通知信息
     * @param message
     * @return void
     */
    void notify(String message);
}

//观察目标具体实现
public class UserPhoneSubject implements Subject {
    List<Observer> observers = new ArrayList<>();
    @Override
    public void attach(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void detach(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void notify(String message) {
        observers.stream().forEach(
                observer-> {observer.update(message);}
        );
    }
}
// 观察者接口
public interface Observer {
    /**
     * @method update
     * @description: 观察者接到通知后的操作
     * @param message
     * @return void
     */
   void update(String message);
}
//具体观察者接口实现 观察者1
public class WeChatMessage implements Observer {

    public void update(String message) {
        System.out.println("微信发送通知:"+ message);
    }
}
//具体观察者接口实现 观察者2
public class EmailMessage implements Observer {
    public void update(String message) {
        System.out.println("邮件发送通知:"+ message);
    }
}

//发布类
public class ContextPublish {

    private UserPhoneSubject subject = new UserPhoneSubject();
    
    public ContextPublish(){
        List<Observer> observers = new ArrayList<>();
        Observer emailMessage = new EmailMessage();
        Observer weChatMessage = new WeChatMessage();
        observers.add(emailMessage);
        observers.add(weChatMessage);
        for(Observer observer : observers){
            subject.attach(observer);
        }
    }
    public void publish(String message){
        subject.notify(message);
    }
public class TestPublish {
    public static void main(String[] args) {
    	String message = "电话号码已更改";
        ContextPublish contextPublish = new ContextPublish();
        contextPublish.publish(message);
    }
}
//运行结果
//邮件发送通知:电话号码已更改
//微信发送通知:电话号码已更改

总结

观察目标循环调用观察者的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值