Avatar billede rmjdk Nybegynder
26. april 2006 - 00:53 Der er 15 kommentarer

Observer problem

Hej,

Min mainApp opretter et GUI objekt (som er Observer), og Subjektet samt attacher() GUI til Subjektet - Subjektet indeholder nu GUI som observer. I en tredje klasse (kalder vi MiscClass vil jeg så kunne kalde en metode, changeState(), på mit Subjekt som så kører notifyObservers().
Her opstår problemet, eftersom MiscClass ikke har oprettet GUI kan den derfor ikke attache den til Subjektet, og derfor kan Subjektet ikke notify() nogle observers! altså skidtet virker ikke!

Jeg har prøvet at illustrere problemet:

http://peecee.dk/?id=36931

og

http://peecee.dk/?id=36932&noresize=yes

Hvis mit Subjekt var en Singleton ville jeg jo, hvis Subjektet ER oprettet, kunne få en reference til dette, ellers kører den jo bare en new Subjekt() - og Subjektet har derfor ingen Observer..

på forhånd tak!
Avatar billede spaceus Nybegynder
26. april 2006 - 09:24 #1
kom lige med lidt kode ;)... hvem opretter miscClass og det må da være muligt at lave den reference. Din observable klasse må jo ha' en addObserver eller lignene
Avatar billede rmjdk Nybegynder
26. april 2006 - 10:40 #2
Ja, min Observable (Subjekt) har en addObserver, men da det kun er MainApp der kender både Subjekt og Observer må det naturligvis være MainApp der laver en Subjekt.addObserver(GUI); MEN det er jo i MiscClass jeg skal bruge den reference :)

Jeg vil mene kode er overflødigt her, men kan godt smide noget op...
Avatar billede spaceus Nybegynder
26. april 2006 - 10:59 #3
og hvem opretter så miscClass.. har den en ref til Subjekt og GUI så skal de jo sendes med..

er lidt svært at sige hvad du skal gøre så længe miscClass optræder som en klasse der pludselig bare er kommet i spil.. den må jo komme et sted fra
Avatar billede rmjdk Nybegynder
26. april 2006 - 11:18 #4
MiscClass er en Singleton der har en reference til Subjekt.
Avatar billede spaceus Nybegynder
26. april 2006 - 11:22 #5
nu det nok mig der er blevet lidt forvirret, men Singleton er et mønster som garantere at der kun er en instans af klassen ikke?

så held og lykke med det, vil da gerne se lidt kode, kan være det kan fjerne lidt forvirring...
Avatar billede rmjdk Nybegynder
26. april 2006 - 11:28 #6
Lige præcis, du spurgte hvem der opretter MiscClass, da det er en Singleton opretter den jo sig selv når den skal bruges med getInstance();

Hvad vil du ha kode af? er mere end villig til at smide op men skal lige vide hvilken del...
Avatar billede rmjdk Nybegynder
26. april 2006 - 11:34 #7
package FW;

import java.util.Observable;
import java.util.Observer;

public class ExceptionSubject extends Observable
{
  private String state; // exception msg
  private static ExceptionSubject ref;

  public ExceptionSubject()
  {
  }
 
  public ExceptionSubject(Observer observer)
  {
    attach(observer);
  }
 
  // virker ikke
  public static ExceptionSubject getRef()
  {
    return ref;
  }
 
  public void attach(Observer observer)
  {
    addObserver(observer);
  }
 
  public void doIt()
  {
    setChanged();
    notifyObservers();
  }
 
  public String getState()
  {
    return state;
  }

  public void changeState(String state)
  {
    this.state = state;
   
    doIt();
  }
}
-------------------------------------------------
public class GUI extends JFrame implements Observer
{
<< GUI attribs. >>

  // Observer
  private ExceptionSubject es = new ExceptionSubject(this);

<< GUI kode >>

  public void update(Observable observable, Object arg)
  {
    System.out.println("update() i GUI kørt");
    System.out.println(((ExceptionSubject)observable).getState());
  }
}
-------------------------------
public class MiscClass
{

  << Her skal jeg kunne køre changeState() på mit Subjekt som kører notify() og GUI kører dermed update();

}
Avatar billede rmjdk Nybegynder
26. april 2006 - 17:32 #8
spaceus, kan du se problemstillingen ?
Avatar billede spaceus Nybegynder
26. april 2006 - 17:40 #9
ja, tror jeg nok... tænker lige lidt... har ikke opgivet endnu ;)
Avatar billede snoop_one Nybegynder
27. april 2006 - 10:54 #10
Hej jeg har lige læst det hele lidt hurtigt igennem, så det kan være at jeg tager fejl.

Men kan det ikke lade sig gøre at din MiscClasse får en reference med af din ExceptionSubject?

så du i din mainapp har noget ala,

ExceptionSubject ex = new ExceptionSubject();
GUI gui = new GUI();
ex.attach(gui)
MiscClass.getInstance().attachSubject(ex);

Er det en mulighed?
Avatar billede rmjdk Nybegynder
27. april 2006 - 16:11 #11
snoop_one, ja det kan man selvfølgelig, men jeg skulle gerne holde præsentationslaget adskilt fra mit persistensframework (hvor jeg skal bruge ExceptionSubject).

Der må da være en løsning på problemet ?!
Avatar billede snoop_one Nybegynder
27. april 2006 - 16:34 #12
Det kommer vel an på hvor MiscClassen ligger og hvad den har af ansvarsområder... Noget tyder på en en uklarhed i dit overordnet design.
Avatar billede rmjdk Nybegynder
27. april 2006 - 17:11 #13
snoop_one: Hvor den ligger? den ligger godt nok i en anden pakke, men det er jo ganske underordnet her. MiscClass er bare til for, at demonstrere, at jeg skal kunne tilgå ExceptionSubject fra en hvilken som helst anden klasse.
Avatar billede snoop_one Nybegynder
28. april 2006 - 10:10 #14
Meningen med hvor den ligger er mere i forstand af i hvilket lag i din arkitektur. Hvis det er en controller classe der skal binde nogle forskellige klasser sammen på en bestemt måde, så synes jeg ikke at den går i strid med adskillelse af præsentationslaget og dit persitentframework.
Avatar billede rmjdk Nybegynder
30. april 2006 - 12:40 #15
Det er min Persistens Facade der skal kunne kalde Subjektet, har efterhånden snakket med en del, og ingen mener det kan løses på en pæn måde...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester