Decorator Pattern,在不改变原始设计结构的基础上,为其添加功能。
比如有一个毛坯房,现在要给这个毛坯房做装饰,想一下,装饰后的房子结构上并没有变化,装饰前的房子功能很局限,而装修后的房子功能全面,能睡觉、能洗澡、能看电视…所以装饰者模式的本质是在不惊动原始设计的基础上,为其添加功能。比如,在毛坯的基础上刮大白、贴瓷砖,在刮了大白的基础上再添加家具。
Demo:
public interface HouseService {
/**
* 展示房子状态和功能
*/
void show();
}
接口实现类
public class HouseServiceImpl implements HouseService {
public void show() {
System.out.println("毛坯房");
}
}
装饰者模式
/**
* @Author: Forward Seen
* @CreateTime: 2022/04/12 10:19
* @Description: 装饰HouseServiceImpl
*/
public class HouseServiceImplDecorator implements HouseService {
private HouseService houseService;
public HouseServiceImplDecorator(HouseService houseService) {
this.houseService = houseService;
}
public void show() {
houseService.show();
//增强的功能
System.out.println("贴瓷砖,刮大白");
}
}
public class HouseTest {
@Test
public void testHouse(){
System.out.println("---------原对象---------");
HouseServiceImpl houseService = new HouseServiceImpl();
houseService.show();
//装饰
System.out.println("---------装饰后---------");
HouseServiceImplDecorator houseService1 = new HouseServiceImplDecorator(houseService);
houseService1.show();
//还可以层层装饰
System.out.println("---------再装饰---------");
HouseServiceImplDecorator houseService2 = new HouseServiceImplDecorator(houseService1);
houseService2.show();
}
}
测试结果:
由此例子可以看出,装饰者模式它在没有改变原有的代码基础上,增强代码的功能或者说增加了新的方法。