venerdì 28 novembre 2008

Observer Design Pattern

OBSERVER DESIGN PATTERN:
Obiettivo: modificare lo stato di un oggetto in conseguenza del cambiamento dello stato di un altro oggetto.

Questo pattern è usato soprattutto nelle applicazioni GUI, definendo per esempio una relazione uno-a-uno o uno-a-molti tra oggetti swing tale che quando cambia lo stato di uno, lo stato di uno o piu altri cambia in modo automatico. Nel nostro esempio useremo il Pattern Observer (noto anche come Publish-Subscribe) nella creazione di un'applicazione GUI in cui è definito un JFrame (Observer) che visualizza le stringe inserite dall'utente mediante standard input (Observable). La prima classe implementa Observer, la seconda estende Observable, due classi presenti nelle API standard in java.util.


package
designPatterns.observer;

import java.io.*;
import java.util.*;
import javax.swing.*;
import java.awt.event.*;

public class Main {

    public static void main(String args[]) {
        InputConsole input = new InputConsole();
        OutputForm output = new OutputForm();
        input.addObserver(output);
        input.read();
    }
}

class OutputForm extends JFrame implements Observer {

    JTextField display;

    public OutputForm() {
        display = new JTextField(10);
        getContentPane().add(display);
        setTitle("Observer form");
        setSize(200, 100);
        setLocation(200, 100);
        setVisible(true);
        //exit when closing application
        addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    public void update(Observable ob, Object o) {
        if (o instanceof String) {
            String text = (String) o;
            display.setText(text);
        }
    }
}

class InputConsole extends Observable {

    public void read() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String inputString;
            while (!(inputString = br.readLine()).equals("exit")) {
                setChanged();
                notifyObservers(inputString);

            }
            System.exit(0);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Nessun commento: