2016-08-27 3 views
1

есть PC класс и Monitor класс. Как защитить метод монитора класса, который вы не могли использовать, когда ПК выключен (статус)?Как защитить методы композиции?

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; 
} 

и внутри Monitor класса

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

Так что, когда (status == false) я не хочу, чтобы иметь возможность вызвать любой метод.

thePc.getTheMonitor().drawPixelArt(1200, 1000, "RED"); например

getTheMonitor() возвращается Object, поэтому я не могу попробовать поймать его.

Может кто-нибудь помочь мне, как с этим бороться?

+0

я мог бы использовать частные методы получения, а затем другой метод проверяет статус ПК, но, возможно, есть еще один ответ. Я все еще участвую, поэтому, пожалуйста, будьте терпимы;) –

+0

FYI, здесь модели AOP (аспектно-ориентированное программирование) могут быть полезны. В более сложных рамках вы можете сделать это через перехватчики. В довольно простой программе принятый ответ - это путь. –

ответ

0

Я думаю, что вы правильно спроектировали объект ПК как совокупность его частей, используя соотношение между ними. Однако слабый момент заключается в том, чтобы предоставить доступ к фактическим компонентам, поскольку он позволяет нарушать введенные вами инварианты (например, вы не можете рисовать Монитор, если ПК не включен, что имеет смысл).

Может быть, вы хотели бы, чтобы скрыть детали компонентов и единый интерфейс для каждой операции через объект ПК, реализуя в некотором роде шаблон Фасад (https://en.wikipedia.org/wiki/Facade_pattern)

+0

Offcourse, которые имеют смысл. Я бы попытался реализовать версию 1.2 с этим шаблоном. **Спасибо за совет.** ;) –

0

Если вы связаны с этой конструкцией, вы можете проверить состояние в приемнике монитора и выбросить исключение IllegalStateException.

+0

Я делаю это для нужд науки. Я просто поступил так, как ты сказал. –

1

Предполагая, что Monitor может быть доступен только через getTheMonitor() из вашего класса PC, вы можете обернуть Monitor экземпляр в декоратор, который будет проверять, если status является true и если нет, то может бросить и исключение или просто игнорировать вызов.

внутренний класс положить в свой класс 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") 
     } 
    } 
} 

Тогда ваш метод getTheMonitor() будет:

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

Это предполагает, что у вас есть интерфейс общего между MonitorStatusAware и Monitor в котором у вас есть метод drawPixelArt, в этом примере я предполагаю, что Monitor - это ваш интерфейс.

+0

Да, это самое лучшее для моих нужд. Огромное спасибо. ;) –

Смежные вопросы