装饰器的价值在于装饰,他并不影响被装饰类本身的核心功能。个人理解是在已完成的某个方法上可以再进行其他的操作,但不影响那个被装饰的方法。
实例:
有一个logger的接口,接口中有一个方法log,是打印日志的内容,有两个类分别实现了这个接口,一个是到本地,一个是到云端,或者假设可能输出到很多地方,如果我们需要在log方法前或者后进行其他操作,比如打印时间,或者其他操作,笨方法就是一个个的在每一个的实现接口的方法上加,这样很冗余,而且很麻烦吗,那么装饰者模式就是帮我们在不改变这些打印到云端或者本地的被修饰着的本身的情况下,统一添加修饰的方法
Logger接口:
package com.pqw.decorator.demo;
/**
* 接口本身
* @author pengqingwen
*
*/
public interface Logger {
public void log();
}
LoggerCloud(被装饰者1)
package com.pqw.decorator.demo;
/**
* 打印到云端
* @author pengqingwen
*
*/
public class LoggerCloud implements Logger{
@Override
public void log() {
System.out.println("输出日志到云端");
}
}
LoggerFile(被装饰着2)
package com.pqw.decorator.demo;
/**
* 打印到本地
* @author pengqingwen
*
*/
public class LoggerFile implements Logger{
@Override
public void log() {
System.out.println("输出日志到文件");
}
}
下面可能有被装饰着N。
我们现在想在这些被装饰着的log方法上或者下做一些操作,比如说打印时间:
DectorLogger(装饰者)
package com.pqw.decorator.demo;
import java.util.Date;
/**
* 装饰者
* @author pengqingwen
*
*/
public class DectorLogger implements Logger{
private Logger logger;
public DectorLogger(Logger logger){
this.logger=logger;
}
@Override
public void log() {
System.out.println("日志的内容:"+"test");
this.logger.log();
System.out.println("日志的时间:"+new Date());
}
}
测试结果:
package com.pqw.decorator.demo;
/**
* 测试
* @author pengqingwen
*
*/
public class Main {
public static void main(String[] args) {
Logger log=new DectorLogger(new LoggerCloud());
log.log();
Logger log1=new DectorLogger(new LoggerFile());
log1.log();
}
}
结果:
日志的内容:test
输出日志到云端
日志的时间:Sun Apr 28 14:15:17 CST 2019
日志的内容:test
输出日志到文件
日志的时间:Sun Apr 28 14:15:17 CST 2019
很显然,我们没有改变被修饰者,但是还是能在打印功能前后增加其他操作
qq:1992093891