观察者模式

来源:互联网 发布:mac桌面下方软件 编辑:程序博客网 时间:2024/05/16 01:26

《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>();}@Overridepublic void registerObserver(Observer ob) {// TODO Auto-generated method stubobservers.add(ob);}@Overridepublic void removeObserver(Observer ob) {// TODO Auto-generated method stubint i = observers.indexOf(ob);if(i>=0){observers.remove(i);}}@Overridepublic void notifyObservers() {// TODO Auto-generated method stubfor(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);}@Overridepublic void update(Customer customer) {// TODO Auto-generated method stubSystem.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", "女"));}}



测试结果如下:



 

0 0
原创粉丝点击