一、概念
- 个人理解:客户端与服务端一对多的关系;比如:做了某件事,需要通知多方的服务。
二、场景
- 做一件事,多个服务都能收到信息;例如:下订单后,支付成功,用户需要收到邮件通知,短信通知、微信通知等。
三、实现
- 条件
- 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();
- 新建事件类,类名:
四、优缺点
- 优点
- 遵守了开闭原则。
- 缺点
- 增加了代码的复杂性。