设计模式--装饰者模式

装饰器的价值在于装饰,他并不影响被装饰类本身的核心功能。个人理解是在已完成的某个方法上可以再进行其他的操作,但不影响那个被装饰的方法。

实例:

有一个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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值