Шаблон Decorator Java

Необходимо расширить функциональные возможности объекта, используя прозрачный для клиента способ. Расширяемый класс реализует тот же самый интерфейс, что и исходный класс, делегируя исходному классу выполнение базовых операций. Шаблон Decorator даёт возможность динамического изменения поведения объектов в процессе выполнения приложения.

clip_image002

Рис. 5.10. Пример реализации шаблона Decorator

/*пример # 21 : определение интерфейса для компонентов : Driver.java */

package chapt05.decorator;

public abstract class Driver {

public abstract void do();

}

Класс DriverDecorator определяет для набора декораторов интерфейс, соответствующий интерфейсу класса Driver, и создает необходимые ссылки.

/*пример # 22 : интерфейс-декоратор для класса Driver : DriverDecorator.java */

package chapt05.decorator;

public abstract class DriverDecorator extends Driver {

protected Driver driver;

public DriverDecorator(Driver driver) {

this.driver = driver;

}

public void do() {

driver.do();

}

}

Класс CarDriver определяет класс, функциональность которого будет расширена.

/*пример # 23 : класс просто водителя : CarDriver.java */

package chapt05.decorator;

public class CarDriver extends Driver {

public void do() { //базовая операция

System.out.println("I am a driver");

}

}

Класс BusDriver добавляет дополнительную функциональность
addedBehaviorOne() необходимую для водителя автобуса, используя функциональность do() класса CarDriver.

/*пример # 24 : класс водителя автобуса: BusDriver.java */

package chapt05.decorator;

public class BusDriver extends DriverDecorator {

public BusDriver(Driver driver) {

super(driver);

}

private void addedBehaviorOne() {

System.out.println("I am bus driver");

}

public void do() {

driver.do();

addedBehaviorOne();

}

}

Класс CarDriverAndForwardingAgent добавляет дополнительную функциональность addedBehaviorTwo() необходимую для водителя-экспедитора, используя функциональность do() класса CarDriver.

/*пример # 25 : класс водителяэкспедитора:CarDriverAndForwardingAgent.java*/

package chapt05.decorator;

public class CarDriverAndForwardingAgent

extends DriverDecorator {

public CarDriverAndForwardingAgent(Driver driver){

super(driver);

}

private void addedBehaviorTwo() {

System.out.println("I am a Forwarding Agent");

}

public void do() {

driver.do();

addedBehaviorTwo();

}

}

Создав экземпляр класса CarDriver можно делегировать ему выполнение задач, связанных с водителем автобуса или водителя-экспедитора, без написания специализированных полновесных классов.

/*пример # 26 : использование шаблона Decorator : Main.java */

package chapt05.decorator;

public class Main {

public static void main(String args[]){

Driver carDriver = new CarDriver();

Main runner = new Main();

runner.doDrive(carDriver);

runner.doDrive(new BusDriver(carDriver));

runner.doDrive(

new CarDriverAndForwardingAgent(carDriver));

}

public void doDrive(Driver driver){

driver.do();

}

}

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100