一、装饰器模式
1.基本概念和功能
装饰器模式能够实现从一个对象的外部来给对象添加功能,有非常灵活的扩展性,可以在对原来的代码毫无修改的前提下,为对象添加新功能。除此之外,装饰器模式还能够实现对象的动态组合,借此我们可以很灵活地给动态组合的对象,匹配所需要的功能。
适用场景
- 适合需要(通过配置,如:diamond)来动态增减对象功能的场景。
- 适合一个对象需要N种功能排列组合的场景(如果用继承,会使子类数量爆炸式增长)
2.举例分析
假设现在有这样一个需求,让你设计一个装修功能,用户可以动态选择不同的装修功能来装饰自己的房子。例如,水电装修、天花板以及粉刷墙等属于基本功能,而设计窗帘装饰窗户、设计吊顶装饰房顶等未必是所有用户都需要的,这些功能则需要实现动态添加。还有就是一旦有新的装修功能,我们也可以实现动态添加。
1.接口定义:去定义具体需要实现的相关方法
/**
* 描述:定义一个基本装修接口
*
* @author yanfengzhang
* @date 2020-04-19 13:32
*/
public interface IDecorator {
/**
* 装修方法
*/
void decorate();
}
2.具体对象:针对需要实现的方法做初始化操作,即基本的实现
/**
* 描述:装修基本类
*
* @author yanfengzhang
* @date 2020-04-19 13:32
*/
public class Decorator implements IDecorator {
/**
* 基本实现方法
*/
@Override
public void decorate() {
System.out.println("水电装修、天花板以及粉刷墙.");
}
}
3.装饰类:抽象类,初始化具体对象
/**
* 描述:基本装饰类
*
* @author yanfengzhang
* @date 2020-04-19 13:34
*/
public abstract class BaseDecorator implements IDecorator {
private IDecorator decorator;
public BaseDecorator(IDecorator decorator) {
this.decorator = decorator;
}
/**
* 调用装饰方法
*/
@Override
public void decorate() {
if (decorator != null) {
decorator.decorate();
}
}
}
4.其他具体装饰类实现自己特性的需求
如果我们想要在基础类上添加新的装修功能,只需要基于抽象类 BaseDecorator 去实现继承类,通过构造函数调用父类,以及重写装修方法实现装修窗帘的功能即可。
/**
* 描述:窗帘装饰类
*
* @author yanfengzhang
* @date 2020-04-19 13:35
*/
public class CurtainDecorator extends BaseDecorator {
public CurtainDecorator(IDecorator decorator) {
super(decorator);
}
/**
* 窗帘具体装饰方法
*/
@Override
public void decorate() {
System.out.println("窗帘装饰。。。");
super.decorate();
}
}
5.实际使用
/**
* 描述:具体使用测试
*
* @author yanfengzhang
* @date 2020-04-19 13:36
*/
public class Test {
public static void main(String[] args) {
IDecorator decorator = new Decorator();
IDecorator curtainDecorator = new CurtainDecorator(decorator);
curtainDecorator.decorate();
}
}