设计模式之观察者模式

一、概念

  • 个人理解:客户端与服务端一对多的关系;比如:做了某件事,需要通知多方的服务。

二、场景

  • 做一件事,多个服务都能收到信息;例如:下订单后,支付成功,用户需要收到邮件通知,短信通知、微信通知等。

三、实现

  • 条件
    • java
  • 角色
    • 观察者
    • 被观察者
    • 事件
  • 场景
    • 在网站上购买物品,下订单,支付,邮件\短信通知为场景实现观察者模式。
  • 代码实现
    • 新建事件类,类名:
           package com.ObServerPattern;
            
           public class Event {
               //事件类型
               public String EventType;
               //事件源
               public Object EventResource;
               //事件结果
               public String EventResult;
               //事件名称
               public String EventName;
           } 
      
    • 新建订单类,类名:Order
              package com.ObServerPattern;
               
              public class Order {
                  //订单号
                  public String OrderNum;
                  //价格
                  public double Price;
              } 
      
    • 新建被观察者类,类名:AbstractObServable
          package com.ObServerPattern;
          
          import java.util.ArrayList;
          import java.util.List; 
          public abstract class AbstractObServable {
              //对象集合
              protected List<AbstractObServer> list = new ArrayList<>();
              //添加对象
              public void Add(AbstractObServer sendService)
              {
                  list.add(sendService);
              }
              //发送
              protected void Send(Event event)
              {
                  list.forEach(o ->{
                      o.Send(event);
                  });
              }
              public void Pay(Order order){} 
              public void Refund(){}
          }
      
      
    • 新建支付类,类名:PayService 继承:AbstractObServable
          package com.ObServerPattern;
          
          import java.util.ArrayList;
          import java.util.List;
           
          public class PayService extends AbstractObServable {
              /*
              * 订单支付
              * */
              @Override
              public void Pay(Order order)
              {
                  Event event = new Event();
                  event.EventName  = "Pay";
                  event.EventResource = "PayService";
                  event.EventResult = "支付成功";
                  event.EventType = "Pay";
                  System.out.println("订单号\t价格");
                  System.out.println(order.OrderNum+"\t\t"+order.Price);    //发送信息
                  Send(event);
              }
          }
      
      
    • 新建观察者抽象类,类名:AbstractObServer
          package com.ObServerPattern;
          
          public abstract class AbstractObServer {
              public abstract void Send (Event  event);
          }
      
      
    • 新建观察者邮件服务类,类名:EmailService
          package com.ObServerPattern; 
          public class EmailService extends AbstractObServer {
              /*
              * 发送邮件
              * */
              @Override
              public void Send(Event event)
              {
                  if ("Pay".equals(event.EventType))
                  {
                      System.out.println("支付邮件发送成功!");
                  }
                  else if ("Refund".equals(event.EventType))
                  {
                      System.out.println("退款邮件发送成功!");
                  }
              }
          }  
      
    • 新建观察者短信服务类,类名:SMService 继承:AbstractObServer
          package com.ObServerPattern;
           
          public class SMService extends AbstractObServer {
              /*
              * 短信发送
              * */
              @Override
              public void Send(Event event)
              {
                  if ("Pay".equals(event.EventType))
                  {
                      System.out.println("支付短信发送成功!");
                  }
                  else if ("Refund".equals(event.EventType))
                  {
                      System.out.println("退款短信发送成功!");
                  }
              }
          }
      
      
    • 新建退款服务类,类名:
              package com.ObServerPattern; 
              public class RefundService extends AbstractObServable {
                  @Override
                  public void Refund() {
                      Event event = new Event();
                      event.EventName  = "Refund";
                      event.EventResource = "RefundService";
                      event.EventResult = "退款成功";
                      event.EventType = "Refund";
                      Send(event);
                  }
              } 
      
    • 入口函数类:
              Order order= new Order();
              order.OrderNum="123";
              order.Price = 213;
              AbstractObServable payService= new PayService();
              payService.Add(new EmailService());
              payService.Add(new SMService());
              payService.Pay(order);
      
              AbstractObServable refundService= new RefundService();
              refundService.Add(new EmailService());
              refundService.Add(new SMService());
              refundService.Refund();
      

四、优缺点

  • 优点
    • 遵守了开闭原则。
  • 缺点
    • 增加了代码的复杂性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值