《Head First Design Patterns》观察者模式学习练习:
观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,他的所有观察者都会收到通知并自动更新。
首先,定义观察者模式:主题+观察者 = 观察者模式
以客户和客服人员为例,当有客户咨询时,需要通知每个客服人员。
其中,Subject为主题接口,Customer为顾客信息,CustomData为主题接口实现类
Observer为观察者接口,ServiceAgent为观察者接口实现类。
TestObserver为测试类。
主题:
/*
* 主题
*/
public interface Subject {
public void registerObserver(Observer ob);
public void removeObserver(Observer ob);
public void notifyObservers();
}
/*
* 顾客信息
*/
public class Customer {
//姓名
private String name;
//年龄
private String age;
//性别
private String gender;
public Customer(String name, String age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
}
public class CustomData implements Subject{
private ArrayList<Observer> observers;
private Customer customer;
public CustomData() {
observers = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer ob) {
// TODO Auto-generated method stub
observers.add(ob);
}
@Override
public void removeObserver(Observer ob) {
// TODO Auto-generated method stub
int i = observers.indexOf(ob);
if(i>=0){
observers.remove(i);
}
}
@Override
public void notifyObservers() {
// TODO Auto-generated method stub
for(int i=0; i<observers.size();i++){
Observer ob = observers.get(i);
ob.update(customer);
}
}
public void setCustomer(Customer customer){
this.customer = customer;
notifyObservers();
}
}
观察者
:
/*
* 观察者
*/
public interface Observer {
public void update(Customer customer);
}
public class ServiceAgent implements Observer{
/*
* 客服名称
*/
private String name;
public ServiceAgent(CustomData cData) {
cData.registerObserver(this);
}
@Override
public void update(Customer customer) {
// TODO Auto-generated method stub
System.out.println("" + name + "已经接收到客户" + customer.getName() +"的信息");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试类:
public class TestObserver {
public static void main(String[] args){
CustomData customData = new CustomData();
ServiceAgent agent1 = new ServiceAgent(customData);
agent1.setName("agent1");
ServiceAgent agent2 = new ServiceAgent(customData);
agent2.setName("agent2");
ServiceAgent agent3 = new ServiceAgent(customData);
agent3.setName("agent3");
ServiceAgent agent4 = new ServiceAgent(customData);
agent4.setName("agent4");
customData.setCustomer(new Customer("哈利波特", "22", "男"));
customData.setCustomer(new Customer("赫敏", "22", "女"));
}
}