2016-08-27 1 views
1

Ich habe PC Klasse und Monitor Klasse. Wie sichere Methode des Klassenmonitors, die Sie nicht verwenden konnten, wenn der PC ausgeschaltet ist (Status)?Wie sichere Methoden der Zusammensetzung?

public class Pc { 
private Case theCase; 
private Monitor theMonitor; 
private Motherboard theMotherboard; 
private boolean status; 

public void turnOn(){ 
    System.out.println("Pc turned on!"); 
    status = true; 
} 
public void turnOff(){ 
    System.out.println("Pc turned off!"); 
    status = false; 
} 

und innen Monitor Klasse

public void drawPixelArt(int heigh, int width, String color){ 
    System.out.println("Drawing pixel at " + heigh + " x "+ width + " px."); 
} 

Also, wenn (status == false) Ich möchte jedes Verfahren nicht nennen können.

beispiels thePc.getTheMonitor().drawPixelArt(1200, 1000, "RED");

getTheMonitor() kehrt Object, so kann ich versuchen, es nicht zu fangen.

Kann mir jemand helfen, damit umzugehen?

+0

I private Getter verwenden könnte, und dann mit andere Methoden überprüfen den PC-Status, aber vielleicht gibt es noch eine andere Antwort. Ich lerne immer noch, also sei bitte tolerant;) –

+0

FYI, hier können AOP-Modelle (aspect-oriented programming) von Nutzen sein. In komplexeren Frameworks können Sie dies über Interzeptoren tun. In einem eher einfachen Programm ist die akzeptierte Antwort der richtige Weg. –

Antwort

0

Ich denke, Sie haben das PC-Objekt als ein Aggregat seiner Teile richtig entworfen, indem Sie die Zusammensetzungsbeziehung zwischen ihnen verwenden. Der Schwachpunkt hier ist jedoch, den Zugriff auf die tatsächlichen Komponenten zu ermöglichen, da es möglich ist, die Invarianten zu verletzen, die Sie selbst platziert haben (z. B. können Sie nicht im Monitor zeichnen, wenn der PC eingeschaltet ist, was durchaus sinnvoll ist).

Vielleicht möchten Sie die Details der Komponenten verbergen und eine einheitliche Schnittstelle zu jedem Betrieb durch das PC-Objekt zur Verfügung stellen, in irgendeiner Art und Weise Muster einer Fassade Umsetzung (https://en.wikipedia.org/wiki/Facade_pattern)

+0

Natürlich macht das Sinn. Ich würde versuchen, Version 1.2 mit diesem Muster zu implementieren. **Danke für den Hinweis.** ;) –

0

Wenn Sie an diesen Entwurf gebunden sind, können Sie den Status im Getter des Monitors überprüfen und eine IllegalStateException oder so auslösen.

+0

Ich mache es für die Bedürfnisse der Wissenschaft. Ich habe nur so getan, wie du gesagt hast. –

1

Unter der Annahme, dass die Monitor nur durch getTheMonitor() von Ihrer Klasse PC zugegriffen wird, könnten Sie Ihre Monitor Instanz in einen Dekorateur wickeln, die überprüft, ob die statustrue sind und wenn nicht könnte und Ausnahme auslösen oder den Anruf einfach ignorieren.

Die innere Klasse in Ihre Klasse setzen Pc:

private class MonitorStatusAware implements Monitor { 
    public void drawPixelArt(int heigh, int width, String color){ 
     if (status) { 
      theMonitor.drawPixelArt(heigh, width, color) 
     } else { 
      throw new IllegalStateException("The pc is switched off") 
     } 
    } 
} 

Dann getTheMonitor() Ihre Methode wäre:

public Monitor getMonitor() { 
    return new MonitorStatusAware(); 
} 

Dies setzt voraus, dass Sie eine Schnittstelle gemeinsam zwischen MonitorStatusAware und Monitor in dem Sie die Methode drawPixelArt haben, in diesem Beispiel nehme ich an, dass Monitor Ihre Schnittstelle ist.

+0

Ja, es ist das Beste für meine Bedürfnisse. Ich danke dir sehr. ;) –