设计模式——行为型模式_观察者模式/发布-订阅模式

1. 类图

图 6-11 观察者模式的结构图

2. 角色

  • Subject:被观察者,抽象类
  • ConcreteSubject:被观察者的具体类,每个具体类中有列表记录任意数量的观察者
  • Observer:观察者接口
  • ConcrereObserver:具体观察者

3. 代码

  • 观察者
    • 观察者抽象接口
      • public interface Observer {
            public void update(String message);
        }
    • 观察者实现类
      • public class WeixinUser implements Observer {
            private String name;        // 微信用户名
            public WeixinUser(String name) {
                this.name = name;
            }
            @Override
            public void update(String message) {
                System.out.println(name + "-" + message);
            }
        }
  • 被观察者
    • 被观察者接口
      • public interface Subject {
            public void attach(Observer observer);    //增加订阅者
            public void detach(Observer observer);    //删除订阅者
            public void notify(String message);    //通知订阅者更新消息
        }
    • 被观察者实现类
      • public class SubscriptionSubject implements Subject {
        
            private List<Observer> weixinUserlist = new ArrayList<Observer>();        //储存订阅公众号的微信用户
            
            @Override
            public void attach(Observer observer) {
                weixinUserlist.add(observer);
            }
        
            @Override
            public void detach(Observer observer) {
                weixinUserlist.remove(observer);
            }
        
            @Override
            public void notify(String message) {
                for (Observer observer : weixinUserlist) {
                    observer.update(message);
                }
            }
        }
  • 客户端调用
    • public class Client {
          public static void main(String[] args) {
              SubscriptionSubject mSubscriptionSubject=new SubscriptionSubject();
              //创建微信用户
              WeixinUser user1=new WeixinUser("杨影枫");
              WeixinUser user2=new WeixinUser("月眉儿");
              WeixinUser user3=new WeixinUser("紫轩");
              //订阅公众号
              mSubscriptionSubject.attach(user1);
              mSubscriptionSubject.attach(user2);
              mSubscriptionSubject.attach(user3);
              //公众号更新发出消息给订阅的微信用户
              mSubscriptionSubject.notify("刘望舒的专栏更新了");
          }
      }

4. 总结

优点:

  • 解除耦合,让耦合的双方都依赖于抽象,从而使得各自的变换都不会影响另一边的变换

缺点:

  • 开发效率和运行效率问题。一般采用异步实现

猜你喜欢

转载自blog.csdn.net/qq_41157876/article/details/111861499