23种设计模式——装饰器模式
Posted cj_eryue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了23种设计模式——装饰器模式相关的知识,希望对你有一定的参考价值。
装饰模式是对客户端以透明的方式扩展对象的功能,是继承关系的一个替代方案。也就是说,客户端并不会觉得对象在装饰前和装饰后有什么不同,装饰模式可以在不用创造更多子类的情况下,将对象的功能加以扩展,装饰模式的关键在于这种扩展是完全透明的。
先看demo:
先定义一个接口,以及两个实现类
package com.cjian.GOF.decorator;
public interface House {
//装饰风格
void style();
}
package com.cjian.GOF.decorator;
/**
* @description: 待增强类
* @time: 2021/8/31 9:55
*/
public class EuropeanStyle implements House{
@Override
public void style() {
System.out.println("风格为欧式!");
}
}
package com.cjian.GOF.decorator;
/**
* @description: 待增强类
* @time: 2021/8/31 9:55
*/
public class EuropeanStyle implements House{
@Override
public void style() {
System.out.println("风格为欧式!");
}
}
接着编写装饰器类,即增强的功能
package com.cjian.GOF.decorator;
/**
* @description: 抽象装饰类
* @time: 2021/8/31 9:56
*/
public class HouseDecorator implements House{
public House house;
public HouseDecorator(House house) {
this.house = house;
}
@Override
public void style() {
house.style();
}
}
编写增强的具体功能:
package com.cjian.GOF.decorator;
/**
* @description: 具体装饰类
* @time: 2021/8/31 9:57
*/
public class RedDecorator extends HouseDecorator{
public RedDecorator(House house) {
super(house);
}
public void style() {
this.house.style();
System.out.println("红色装饰墙--增强");
}
}
测试:
package com.cjian.GOF.decorator;
/**
* @description:
* @time: 2021/8/31 9:59
*/
public class Test {
public static void main(String[] args) {
ChineseStyle chineseStyle = new ChineseStyle();
chineseStyle.style();
System.out.println("--------------------");
House redChineseStyle = new RedDecorator(chineseStyle);
redChineseStyle.style();
System.out.println("--------------------");
House redEuropeanStyle = new RedDecorator(new EuropeanStyle());
redEuropeanStyle.style();
}
}
这看上去有点代理的味道 ,我们需要从概念上了解代理和装饰的区别:
- 代理是全权代理,目标根本不对外,全部由代理类来完成。
- 装饰是增强,是辅助,目标仍然可以自行对外提供服务,装饰器只起增强作用。
以上是关于23种设计模式——装饰器模式的主要内容,如果未能解决你的问题,请参考以下文章