• 设计模式之观察者模式


    一、概念

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

    二、场景

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

    三、实现

    • 条件
      • 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 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();
        

    四、优缺点

    • 优点
      • 遵守了开闭原则。
    • 缺点
      • 增加了代码的复杂性。
  • 相关阅读:
    项目经理想在职场上混得开,还是得学会它
    为什么我建议需要定期重建数据量大但是性能关键的表
    spring 注解: 更加简单的存储 Bean
    【读书笔记】【Effective C++】实现
    致敬经典 睛彩再现——AVS产业联盟和中国移动咪咕公司携手推动AVS3视频、音频标准
    第三章 UI组件之弹出组件【Android基础学习】
    在pycharm中弹出图后,需要关闭才会显示Process finished with exit code 0
    仅用30秒,Python就能学会的漂亮短代码,你学会了吗?
    线性规划对偶问题:理论推导和实际应用
    Jetson Agx_Orin(Ubuntu20.04)设置vnc远程桌面记录
  • 原文地址:https://blog.csdn.net/Fu_Shi_rong/article/details/127097127