Показ декоратора - PullRequest
       18

Показ декоратора

0 голосов
/ 12 марта 2011

Я учусь на экзамен, и это было на старом тесте:

Дано:

public interface Interface1 {

    void method1();

    void method2().

}

Показать класс шаблона Decorator для интерфейса.

Что это, и есть ли у кого-нибудь ресурсы, где я могу узнать больше об этом?

Ответы [ 3 ]

4 голосов
/ 12 марта 2011

Вот хороший пример из здесь .

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

Из приведенной выше ссылки я привел пример.

Возьмите простое окно типа класса, а затем украсьте его полосами прокрутки:

// the Window interface
interface Window {
    public void draw(); // draws the Window
    public String getDescription(); // returns a description of the Window
}

// implementation of a simple Window without any scrollbars
class SimpleWindow implements Window {
    public void draw() {
        // draw window
    }

    public String getDescription() {
        return "simple window";
    }
}

Это декораторы, сначала абстрактный класс со всем общим кодом для шаблона декоратора.- обратите внимание, что он реализует Window

// abstract decorator class - note that it implements Window
abstract class WindowDecorator implements Window {
    protected Window decoratedWindow; // the Window being decorated

    public WindowDecorator (Window decoratedWindow) {
        this.decoratedWindow = decoratedWindow;
    }
   public void draw() {
        decoratedWindow.draw();
    }
}

Теперь украшение, которое добавляет вертикальную полосу прокрутки к окну.Обратите внимание, что он расширяет WindowDecorator и, следовательно, Window и, следовательно, интерфейс Window

// the first concrete decorator which adds vertical scrollbar functionality
class VerticalScrollBarDecorator extends WindowDecorator {
    public VerticalScrollBarDecorator (Window decoratedWindow) {
        super(decoratedWindow);
    }

    public void draw() {
        decoratedWindow.draw();
        drawVerticalScrollBar();
    }

    private void drawVerticalScrollBar() {
        // draw the vertical scrollbar
    }

    public String getDescription() {
        return decoratedWindow.getDescription() + ", including vertical scrollbars";
    }
}

Примеры шаблонов проектирования GoF в основных библиотеках Java содержит ссылки на множество других шаблонов, реализованных в Java.

1 голос
/ 12 марта 2011

Сообщение Preet является ответом на ваш вопрос

если вы хотите узнать больше о шаблонах проектирования, я настоятельно рекомендую этот пост и ответ BalusC, он показывает реальные примеры с шаблонами проектирования

0 голосов
/ 12 марта 2011

http://www.javacamp.org/designPattern/decorator.html

http://en.wikipedia.org/wiki/Decorator_pattern

Шаблон декоратора может использоваться для расширения (декорирования) функциональности определенного объекта во время выполнения независимо отдругие экземпляры того же класса, при условии, что во время разработки сделаны некоторые фундаментальные работы.Это достигается путем разработки нового класса декоратора, который оборачивает исходный класс.Эта упаковка может быть достигнута с помощью следующей последовательности шагов:

  1. Подкласс исходного класса "Component" в класс "Decorator" (см. Диаграмму UML);
  2. В классе Decoratorдобавьте указатель компонента в качестве поля;
  3. Передайте компонент в конструктор Decorator для инициализации указателя компонента;
  4. В классе Decorator перенаправьте все методы «Компонент» в «Компонент»указатель;и
  5. В классе ConcreteDecorator переопределите все методы компонента, поведение которых необходимо изменить.

для вашего примера

public interface Interface1 {

    void method1();

    void method2().

}

public SimpleInterface implements Interface1 {

    void method1() {
        //method1 actions
    }

    void method2() {
        //method2 actions
    }

}

класс абстрактного декоратора

abstract class InterfaceDecorator implements Interface {
    protected InterfaceDecorator decoratedInterface;

    public InterfaceDecorator (Interface decoratedInterface) {
        this.decoratedInterface = decoratedInterface;
    }

    void method1() {
        decoratedInterface.method1()
    }

    void method2() {
        decoratedInterface.method2()
    }
}

класс декоратора бетона

class Method1InterfaceDecorator extends InterfaceDecorator {
    public Method1InterfaceDecorator(Interface decoratedInterface) {
        super(decoratedInterface);
    }

    void method1() {
        decoratedInterface.method1();
        method3()
    }

    void method3() {
        //method3 actions
    }
}

использование:

public static void main(String[] args) {
    Interface simpleInterface = new SimpleInterface();
    Interface decoratedInterface = new Method1DecoratedInterface (new SimpleInterface());

    // These two method1 calls will behave differently
    simpleInterface.method1();
    decoratedInterface.method1();
}
...