2013-03-24 19 views
0

我的类C1拥有所有静态成员(变量和方法)。它还有一个可观察的C2类型对象的数组A1。我希望C1成为一个观察者,注意到C2的变化,然后通过使用A1中包含的引用将这些变化应用于对象。 我正在使用C1的一个实例,以便它可以添加为C2对象的观察者。Observer observable design pattern - 用静态成员创建一个类Observer?

观察者可观察的设计模式是否适合这种情况?如果是,那么我是否正确应用?

import java.util.*; 

class FlightStatusChangeEvent{ 

int status; 
Flight flight; 

FlightStatusChangeEvent(int statusCode, Flight flight){ 

    this.status = statusCode; 
    this.flight = flight; 

} 

public int getStatus(){return this.status;} 

public Flight getFlight(){return this.flight;} 


} 

class Flight extends Observable{ 

int status;// 0 = on time, -1 = late, +1 = before scheduled time 

public void updateStatus(int statusCode){ 


    this.status = statusCode; 
    FlightStatusChangeEvent fsce = new FlightStatusChangeEvent(status, this); 
    setChanged(); 
    notifyObservers(fsce); 

} 


} 

class FlightStatusMonitor implements Observer{ 

public static ArrayList<Flight> flights = new ArrayList<Flight>(); 

//keep calling this method every 10 sec to get latest flight status 
public void displayStatusOfFlights(){ 

    //print all flight statuses in array list - flights 
} 

public void update(Observable flight, Object flightStatusEvent){ 

    FlightStatusChangeEvent fsce = (FlightStatusChangeEvent) flightStatusEvent;  
    Flight fl = fsce.getFlight(); 
    int status = fsce.getStatus(); 

    //find the flight in array flights and then update its status 

} 


} 
+1

你能分享一些代码?而且所有静态成员类都是一个很好的反模式。你能改变它吗? – DiogoSantana 2013-03-24 02:45:26

+0

@DiogoSantana - 我添加了代码。 – 2013-03-24 03:08:27

+0

为什么FlightStatusMonitor.flights需要是静态的?没有这个,你可以做你想做的事。 – DiogoSantana 2013-03-24 03:11:45

回答

0

这是怎么Observer模式可以在你的情况下,可以实现:

class FlightStatusEvent { 

    int status; 
    Flight flight; 

    FlightStatusEvent(int statusCode, Flight flight) { 
     this.status = statusCode; 
     this.flight = flight; 
    } 

    public int getStatus() { 
     return this.status; 
    } 

    public Flight getFlight() { 
     return this.flight; 
    } 

} 

class Flight extends Observable { 

    int status;// 0 = on time, -1 = late, +1 = before scheduled time 

    public void updateStatus(int statusCode) { 

     this.status = statusCode; 
     FlightStatusEvent fsce = new FlightStatusEvent(status, this); 
     setChanged(); 
     notifyObservers(fsce); 

    } 

} 

class FlightStatusMonitor implements Observer { 

    public ArrayList<Flight> flights = new ArrayList<Flight>(); 

    public void displayStatusOfFlights() { 
     for(Flight f : flights) { 
      System.out.println("Flight " + f + ", status = " + f.status); 
     } 
    } 

    public void update(Observable flight, Object flightStatusEvent) { 
     displayStatusOfFlights(); 
    } 

    public static void main(String[] args) { 
     FlightStatusMonitor fsm = new FlightStatusMonitor(); 

     Flight f1 = new Flight(); 
     f1.addObserver(fsm); 
     Flight f2 = new Flight(); 
     f2.addObserver(fsm); 

     ArrayList<Flight> flights = new ArrayList<Flight>(); 
     flights.add(f1); 
     flights.add(f2); 

     fsm.flights = flights; 
     fsm.displayStatusOfFlights(); 

     // this will trigger observer pattern event. 
     f1.updateStatus(1); 
    } 

} 
+0

Param为什么你改变我的静态成员代码给班级成员?对于静态类,O-O模式是否失败? – 2013-03-27 09:31:03

+0

理论上,静态字段/方法属于类(而不是对象)。在你的情况下,航班对象属于FSM对象,而不是类本身。 O-O模式可以同时使用静态/非静态方法/字段。 – Param 2013-03-27 17:46:01