[WikiDyd] [TitleIndex] [WordIndex

JiMP2

Pytania z 17-06-2008

  1. W jaki sposób w aplikacji wykorzystującej bibliotekę Swing wiąże się aktywność użytkownika z kodem wykonywanym?
  2. Co to jest wzorzec projektowy? Proszę opisac dowolny wzorzec projektowy.
  3. Proszę zaprojektowac klasę Square implementująca interfejs ComparableFigure<Square>. Klasa powinna zawierać przynajmniej jeden konstruktor i przesłaniać equals, hashCode i toString z klasy Object.

   1 public interface ComparableFigure<T extends ComparableFigure> {
   2   public boolean isSame( T o );
   3   public int compareTo( T o );
   4 }

Odpowiedzi

ad. 1

Z każdym komponentem Swinga można związać obiekty zawierające metody uruchamiane po zajściu określonych zdarzeń związanych z komponentem. Dokonuje się tego przez wywołanie metod typu addEventListener (gdzie Event określa rodzaj zdarzenia - np. aktywność myszy lub klawiatury, itp), której argumentem jest obiekt implementujący określony interfejs EventListener (Event jak wyżej).

Interfejs specyfikuje metody, które są wykonywane po zajściu określonych zdarzeń - np. MouseListener zawiera metodę "onClick", wywoływaną po kliknięciu przyciskiem myszy.

Twórca programu może tworzyć własne implementacje tych interfejsów (bezpośrednio, lub przez rozszerzanie klas szkieletowych typu EventAdapter - Event j.w.) i w tych implementacjach zamieszczac w okreslonych metodach kod wykonywany po określonych zdarzeniach (akcjach uzytkownika GUI). Np.:

   1   // ...
   2   JButton resetBtn - new JButton();
   3   resetBtn.addActionListener( new ActionListener() {
   4       public void actionPerformed( ActionEvent e ) {
   5         application.resetItself();
   6       }
   7     } );
   8   // ...
   9 

ad. 2

Definicja (kiepska): wikipedia

W rzeczywistości: Wzorzec projektowy (w inżynierii oprogramowania): uniwersalne, sprawdzone w praktyce rozwiązanie często pojawiających się, powtarzalnych problemów projektowych. Problem projektowy polega na określeniu struktury klas, które współtworzą program lub jego fragment. WP jest szablonem, który określa, jakie klasy nalezy stworzyć i jak zdefiniowac współpracę pomiedzy obiektami tych klas.

Przykłady: http://wiki.java.net/bin/view/Javapedia/Patterns http://www.patterndepot.com/put/8/JavaPatterns.htm

ad. 3.

   1 // importy sa nadmiarowe - zeby mozna bylo napisac metode main i bawic sie ta klasa
   2 import java.util.HashSet;
   3 import java.util.TreeSet;
   4 import java.util.Comparator;
   5 
   6 public class Square implements ComparableFigure<Square> {
   7   private double a;
   8 
   9   public Square( double a ) {
  10     this.a = a;
  11   }
  12 
  13   @Override
  14   public boolean equals( Object o ) {
  15     return o instanceof Square && ((Square)o).a == a;
  16   }
  17 
  18   @Override
  19   public int hashCode() {
  20     return (int) (((int) 1000*a ) % 251);
  21   }
  22 
  23   @Override
  24   public String toString() {
  25     return "Square(" + a + ")";
  26   }
  27 
  28   public boolean isSame( Square o ) {
  29     return a == o.a;
  30   }
  31 
  32   public int compareTo( Square o ) {
  33     if( o.a > a )
  34       return -1;
  35     else if( o.a == a )
  36       return 0;
  37     else
  38       return 1;
  39   }
  40 
  41   // to jest nadmiarowe - zeby mozna bylo bawic sie ta klasa
  42     private static class SqComparator implements Comparator<Square> {
  43     public int compare( Square s1, Square s2 ) {
  44       return s1.compareTo( s2 );
  45     }
  46   }
  47 
  48   public static void main( String [] args ) {
  49     if( args.length < 1 ) {
  50       System.err.println( "At least one argument needed.\nArguments must be double numbers\n" );
  51     } else {
  52       HashSet<ComparableFigure<Square>> store = new HashSet<ComparableFigure<Square>>();
  53       Comparator<Square> sqc = new SqComparator();
  54       TreeSet<Square> sorted = new TreeSet<Square>( sqc );
  55 
  56       for( String a : args )
  57         try {
  58           store.add( new Square( Double.parseDouble( a ) ) );
  59           sorted.add( new Square( Double.parseDouble( a ) ) );
  60         } catch( NumberFormatException e ) {
  61           System.err.println( "Bad argument: \"" + a + "\" is not a double number - skipped\n" );
  62         }
  63 
  64       System.out.println( "Hashed:" );
  65       for( ComparableFigure<Square> f : store ) {
  66         Square s = (Square) f;
  67         System.out.println( s + " -> " + s.hashCode() );
  68       }
  69 
  70       System.out.println( "\nSorted:" );
  71       for( Square s : sorted ) {
  72         System.out.println( s );
  73       }
  74     }
  75   }
  76 }

2015-09-23 06:44