观察者模式

作者: ppamos | 来源:发表于2019-06-14 08:57 被阅读0次

    观察者模式

    • 观察者模式的实际应用场景

      • 存在问题:每次创建订单需要加新功能(如新的通知方式),则要修改原有的类,难以维护

      • 违背设计模式的原则

        1.单一职责:订单保存功能,杂糅了消息通知这些功能
        2.开闭原则:对拓展开放,对修改关闭

      • 优化方案:使用观察者模式,使创建订单和消息通知进行分离,低耦合。可以选择消息队列,spring事件机制等,也可以选择自定义

    • 创建一个观察者的接口类

      public interface Observer {
        public void update(String message);
        }
      
    • 创建一个被观察者的接口类

        public void registerObserver(Observer o);
        public void removeObserver(Observer o);
        public void notifyObserver();
      
    • 创建一个观察者的实现类

      public class User implements Observer {
        private String name;
        private String message;
      
        public User(String name){
            this.name=name;
        }
        @Override
        public void update(String message) {
            System.out.println(name+"收到消息"+message);
        }
        public String getName() {
            return name;
        }
      
        public void setName(String name) {
            this.name = name;
        }
      
        public String getMessage() {
            return message;
        }
      
        public void setMessage(String message) {
            this.message = message;
        }
        }
      
    • 创建一个被观察者的实现类

      public class OrderService implements Observed {
      
        private List<Observer> list;
        private String message;
      
        public OrderService(){
            list =new ArrayList<Observer>();
        }
      
        @Override
        public void registerObserver(Observer o) {
      
            list.add(o);
      
        }
        @Override
        public void removeObserver(Observer o) {
            list.remove(o);
        }
      
        @Override
        public void notifyObserver() {
            for (Observer observer:list){
                observer.update(message);
            }
        }
      
        public void setMessage(String message) {
            this.message = message;
            notifyObserver();
        }
         }
      
    • 创建一个测试类

      public class Test {
        public static void main(String[] args) {
            User userxiaohong = new User("xiaohong");
            User userdahang = new User("dahang");
            User userxiaowang = new User("xiaowang");
            OrderService orderService = new OrderService();
            orderService.registerObserver(userxiaohong);
            orderService.registerObserver(userdahang);
            orderService.registerObserver(userxiaowang);
            orderService.setMessage("php是世界上最好的语言");
            System.out.println();
            orderService.removeObserver(userxiaowang);
            orderService.setMessage("php是世界上最好的语言");
        }
      

      }

    • 有人广播了php是世界上最好的语言,小王听不下去了,他取消了订阅,所以他接收不了消息

    • 结果

        xiaohong收到消息php是世界上最好的语言
        dahang收到消息php是世界上最好的语言
        xiaowang收到消息php是世界上最好的语言
        
        xiaohong收到消息php是世界上最好的语言
        dahang收到消息php是世界上最好的语言

    相关文章

      网友评论

        本文标题:观察者模式

        本文链接:https://www.haomeiwen.com/subject/tcgyfctx.html