Table 33.1: Subject-Observer Classes public interface Observable { public void notifyObservers(); public void register(Observer obs); public void unRegister(Observer obs); }
ReportManager類(Listing33.1)提供了聲明在Observable接口中方法的實現。兩個依靠于ReportManager的報表對象使用這些方法注冊它們自己為觀察者。ReportManager把這些注冊的觀察者保存到observersList矢量(vector)中。當前選擇的分類構成了ReportManager對象的狀態,它以實例變量的形式保存在變量department中。當為department設置一個新的值時(也就是ReportManager對象的狀態改變),notifyObservers方法被調用。作為notifyObservers方法的一部分,ReportManager調用注冊為觀察者的refreshData(Observable)方法。 Listing 33.1: ReportManager Class
public class ReportManager extends JFrame implements Observable { … … PRivate Vector observersList; private String department; public ReportManager() throws Exception { … … observersList = new Vector(); … … } public void register(Observer obs) { //Add to the list of Observers observersList.addElement(obs); } public void unRegister(Observer obs) { //remove from the list of Observers } public void notifyObservers() { //Send notify to all Observers for (int i = 0; i < observersList.size(); i++) { Observer observer = (Observer) observersList.elementAt(i); observer.refreshData(this); } } public String getDepartment() { return department; } public void setDepartment(String dept) { department = dept; } class ButtonHandler implements ActionListener { ReportManager subject; public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals(ReportManager.EXIT)) { System.exit(1); } if (e.getActionCommand().equals(ReportManager.SET_OK)) { String dept = (String) cmbDepartmentList.getSelectedItem(); //change in state subject.setDepartment(dept); subject.notifyObservers(); } } public ButtonHandler() { } public ButtonHandler(ReportManager manager) { subject = manager; } } }//end of class
//Client Code public class SupervisorView { … … public static void main(String[] args) throws Exception { //Create the Subject ReportManager objSubject = new ReportManager(); //Create Observers new MonthlyReport(objSubject); new YTDChart(objSubject); } }//end of class
類之間的關聯描述如下:
Figure 33.3: Example application--Class Association