terça-feira, 9 de novembro de 2010

Decorator Pattern



Definição

O padrão Decorator pattern permite que você anexe responsabilidades adicionais e modifique uma funcionalidade de instância dinamicamente. Decorators proporcionam um canal flexível e alternativo à herança para estender funcionalidades, usando a composição em vez de herança.

Quando usar

• Quando você quer adicionar responsabilidades a objetos individuais de forma dinâmica e transparente, sem afetar o objeto original ou outros objetos.
• Quando você quer adicionar responsabilidades ao objeto que você pode vir a mudar no futuro.
• Quando o ramal por subclasses estática é impraticável.

Benefícios

• Mais flexibilidade que herança estática.
• Simplifica a codificação, porque você escreve uma série de classes, cada uma direccionada para uma parte específica da funcionalidade.
• codificação de todos os comportamentos dentro do objeto.
• Aumenta a extensibilidade do objeto, porque você faz alterações codificando
novas classes.

Desvantagens / consequências

Uma coisa a manter em mente ao implementar o Decorator pattern é que
você precisa do componente para manter a interface simples. Você quer evitar de fazer a interface do componente extremamente complexa, pois ter uma interface complexa irá tornar muito mais difícil de obter direito cada decorador.
Outro inconveniente potencial do Decorator pattern é o desempenho e a
sobrecarga associada com uma longa cadeia de decorators.

Exemplo

package com.logica.decorator;
public interface Logger {
public void log(String msg);
}

package com.logica.decorator;
public class LoggerDecorator implements Logger {
Logger logger;

public LoggerDecorator(Logger logger) {
super();
this.logger = logger;
}


public void log(String msg) {
logger.log(msg);
}
}

package com.logica.decorator;
public class ConsoleLogger implements Logger {
public void log(String msg) {
System.out.println(
"Detta ska skrivas till consolen! " + msg);
}
}

package com.logica.decorator;
public class EncryptLogger extends LoggerDecorator {
public EncryptLogger(Logger logger) {
super(logger);
}

public void log(String msg) {
msg = encrypt(msg);
logger.log(msg);
}

private String encrypt(String msg) {
msg = msg.substring(msg.length()-1) + msg.substring(0,
msg.length() -1);
return msg;
}
}

package com.logica.decorator;
public class HTMLLogger extends LoggerDecorator {
public HTMLLogger(Logger logger) {
super(logger);
}

public void log(String msg) {
msg = makeHTML(msg);
logger.log(msg);
}

private String makeHTML(String msg) {
msg =
"<html><body>" + "<b>" + msg + "</b>" + "</body></html>" ;
return msg;
}
}

package com.logica.decorator;
public class LoggerFactory {
public static final String TYPE_CONSOL_LOGGER = "console";
public static final String TYPE_FILE_LOGGER = "file";

public Logger getLogger(String type) {
if(TYPE_CONSOL_LOGGER.equals(type)) {
return new ConsoleLogger();
} else {
return new FileLogger();
}
}
}

package com.logica.decorator;

public class DecoratorClient {
public static void main(String[] args) {
LoggerFactory factory = new LoggerFactory();
Logger logger              =
factory.getLogger(LoggerFactory.TYPE_FILE_LOGGER);

HTMLLogger htmlLogger        = new HTMLLogger(logger);
htmlLogger.log     ("A message to log");
EncryptLogger encryptLogger = new EncryptLogger(logger);
encryptLogger.log("A message to log");
}
}

Quando DecoratorClient for executado o resultado será:
Detta ska skrivas till en fil! <html><body><b>A message to
log</b></body></html>
Detta ska skrivas till en fil! gA message to lo

Nenhum comentário:

Postar um comentário