一、模式定义
观察者模式:定义对象之间的一种一对多的依赖关系,使得每当一个对象状态发生改变时其相关依赖对象皆得到通知并被自动更新。
Observer Pattern:Define a one-to-many dependency between objects so that when one object changes state,all its dependents are notified and updated automatically.
二、模式中包含的角色
(1)Subject(目标):目标又称主题,它是指被观察的对象。在目标中定义了一个观察者集合,一个观察目标可以接受任意数量的观察者来观察,它提供一系列方法来增加和删除观察者对象,同时它定义了通知方法notify()。目标类可以是接口,也可以是抽象类或具体类。
(2)ConcreteSubject(具体目标):具体目标是目标类的子类,它通常包含有经常发生改变的数据,当它的状态发生改变时将向它的各个观察者发出通知;同时它还实现了在目标类中定义的抽象业务逻辑方法(如果有)。如果无需拓展目标类,则具体目标类可以省略。
(3)Observer(观察者):观察者将对观察目标的改变作出反应,观察者一般定义为接口,该接口声明了更新数据的方法update(),因此又称为抽象观察者。
(4)ConcreteObserver(具体观察者):在具体观察者中维护一个指向具体目标对象的引用,它存储具体观察者的有关状态,这些状态需要和具体目标的状态保持一致;它实现了在抽象观察者Observer中定义的update()方法。通常在实现时可以调用具体目标类的attach()方法将自己添加到目标类的集合中或通过detach()方法将自己从目标类的集合中删除。
三、模式类图
四、模式实现:模拟购票成功多平台通知
(1)观察者(ITicketObserver):
package observer;
//抽象观察者
public interface ITicketObserver {
public void sendMsg(int num);
}
(2)目标(TicketCilent):
package observer;
//目标---12306
import java.util.ArrayList;
import java.util.List;
public class TicketCilent {
//定义一个集合---用来保存所有的观察者
private List<ITicketObserver> observer = new ArrayList<ITicketObserver>();
//状态属性---判断是否买票
private int ticket;
public void setTicket(int ticket) {
this.ticket=ticket;
//状态改变,通知观察者
notiofyObserver(this.ticket);
}
//通过外界添加具体观察者---保存在集合中
public void addObserver(ITicketObserver o) {
observer.add(o);
}
//通知观察者
private void notiofyObserver(int num) {
//遍历集合(存放的都是具体观察者)
for(ITicketObserver o : observer) {
o.sendMsg(num);
}
}
}
(3)具体观察者(Message):
package observer;
//具体观察者---发手机短信
public class Message implements ITicketObserver{
@Override
public void sendMsg(int num) {
System.out.println("【手机短信】:成功购买了"+num+"张票");
}
}
(4)具体观察者(Email):
package observer;
//具体观察者---发电子邮件
public class Email implements ITicketObserver{
@Override
public void sendMsg(int num) {
System.out.println("【电子邮件】:成功购买了"+num+"张票");
}
}
(5)具体观察者(Wechat):
package observer;
//具体观察者---发微信公众号
public class Wechat implements ITicketObserver{
@Override
public void sendMsg(int num) {
System.out.println("【微信公众号】:成功购买"+num+"张票");
}
}
(6)客户端(Cilent):
package observer;
//客户端---测试
public class Cilent {
public static void main(String[] args) {
TicketCilent ticketCilent = new TicketCilent();
ticketCilent.addObserver(new Message());
ticketCilent.addObserver(new Email());
ticketCilent.addObserver(new Wechat());
//购买的票数
ticketCilent.setTicket(9);
}
}