小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。
概述
装饰模式,又称装饰者模式、装饰器模式。是一种结构型设计模式,可以将对象放入包含行为的特色封装对象中来动态的为原对象添加一些额外的行为。
装饰模式对比于子类,在增加功能这方面来说,会更加的灵活。
角色
抽象部件:用于声明装饰与被装饰对象的公共接口。
具体部件:实现抽象部件的接口,该类为被装饰对象所属的类,定义了基础的行为。
抽象装饰:该类拥有一个指向被装饰对象的引用成员变量,变量的类型定义为抽象部件,这样可以引用具体的部件和装饰。
具体装饰:定义了可动态添加到部件的额外行为,重写被装饰类的方法。
模板
抽象部件:声明了汽车类需要实现的接口
public interface Car {
/**
* 车的装配
*/
void show();
}
具体部件:汽车接口的具体实现类,声明了奔驰车具体的装配
public class Benz implements Car{
@Override
public void show() {
System.out.println("奔驰车的默认颜色是黑色");
}
}
抽象装饰:定义了抽象部件类型的遍历,引入一个待装饰的对象
public abstract class CarDecorator {
private Car car;
public CarDecorator(Car car) {
this.car = car;
}
public void show(){
this.car.show();
}
}
具体装饰:对被装饰者进行装饰
public class ConcreteCarDecorator extends CarDecorator{
public ConcreteCarDecorator(Car car) {
super(car);
}
/**
* 给车进行彩绘
*/
private void print() {
System.out.println("在车尾绘制“新手”字样,颜色是紫色霞光");
}
/**
* 给车安装GPS设备
*/
private void setGps() {
System.out.println("安装GPS定位导航系统");
}
/**
* 重写方法
*/
@Override
public void show() {
super.show();
this.print();
this.setGps();
}
}
小结
优点
便利:是继承关系的一个替代方案,无需创建新子类即可扩展对象
解耦:装饰类与被装饰类相互独立,部件无需指定装饰类,装饰类也不用指定具体的部件实现
动态:可以动态扩展一个实现类,添加或删除被装饰对象的功能
缺点
复杂:各层的初始化配置代码比较复杂
困难:在装饰器栈中删除特点装饰器比较困难,实现不受装饰栈顺序影响的装饰器比较困难
适用场景
- 希望在无需修改代码的情况下为一个类增加附加功能时
- 需要为一批类进行改装或者加装功能
- 被
final关键字修饰的类做进一步扩展
最后
文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!!!
如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!