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