观察者设计模式:一
观察者设计模式:有一个目标类,观察者对象,当目标对象的状态有更改的时候,观察者时时会有相应的通知并做出相应的操作;
原理:就是在目标对象中耦合观察者的对象,并且在注册观察者对象的时候调用相应操作的方法; 两者之间的关系是单向关联的;目标类和观察类之间维护的是松耦合的关系;
在代码中有需要用到的接口和类有: 观察者接口 目标接口 和相应的实现类;
在观察者类中维护的方法: 更新方法,当目标类相应方法执行后会执行该更新方法
目标类维护的方法和引用:1:维护观察者的引用, 2:提供增加 删除 观察者的方法 3:提供通知观察者执行update 的方法
下面以发短信作为具体的例子来实现:
场景:用户填写预约单,当保存用户预约单成功后需要给这个用户发送短信,发送短信的过程采用的是异步发送,发完短信后需要将短信发送返回的值和相应的业务数据入库:这里将 预约单id 客户手机号码,短信发送状态入库;
具体的代码实现:
1:维护一个观察者接口:
public interface Observe { // 实时监控目标对象的状态 public void update(int i); }
2:维护一个目标接口:目标接口维护 增加,删除观察者,通知观察者执行update的方法
public interface Subject { void attach(Observer o); void detach(Observer o); // 通知订阅者更新消息 void notify(String message); }
3:观察者的实现类:
public class Appointment implements Observe{ private String appointmentId="1111"; private String phoneNum="2222"; public void saveAppointment(){ // TODO 保存预约单成功 System.out.println("保存预约单成功"); // 发送短信 Message.sendMess(new Appointment()); } @Override public void update(int i) { // 保存发送状态 业务单据 入库 System.out.println("返回状态:"+i+"预约单id:"+appointmentId+"用户电话:"+phoneNum); }
4:目标实现类:
public class Message implements Subject{ private static List<Observe> observes=new ArrayList<Observe>(); @Override public void attach(Observe o) { // TODO Auto-generated method stub observes.add(o); } @Override public void detach(Observe o) { // TODO Auto-generated method stub observes.remove(o); } @Override public void notify(int i) { // TODO Auto-generated method stub for (Observe observe : observes) { observe.update(i); } } // 具体发送短信的方法 public static void sendMess(Observe o1){ observes.add(o1); // TODO 请求发送短信接口 返回相应的状态 int i=1; // 发送短信后调用通知方法 Message mess=new Message(); mess.notify(i); }
通过这种方式就实现了当异步发送短信成功后,记录一条短信发送记录数据了;
在下篇博客中将介绍通过回调函数的模式来实现短信发送的日志记录。