装饰器模式
装饰器模式
- 装饰器模式定义:
- 使用场景
- 1、室内装饰:在室内装饰方面,我们可以使用装饰模式来增强房间的美观程度。例如,在客厅中,我们可以使用墙纸、窗帘、地毯等来装饰房间。
- 2、餐厅装饰:在餐厅装饰方面,我们可以使用装饰模式来增强餐厅的氛围和风格。例如,在餐厅中,我们可以使用花卉、烛台、餐具等来装饰餐厅。
- 3、节日装饰:在节日装饰方面,我们可以使用装饰模式来增强节日的气氛。例如,在圣诞节,我们可以使用圣诞树、彩灯、雪人等来装饰房间。
- 4、服装搭配:在服装搭配方面,我们可以使用装饰模式来增强服装的美观程度。例如,在穿搭上,我们可以使用配饰、领带、腰带等来装饰服装。
- 5、车辆装饰:在车辆装饰方面,我们可以使用装饰模式来增强车辆的美观程度。例如,在汽车上,我们可以使用车贴、轮毂、车身装饰等来装饰车辆。
- 总结
- 1. 需要扩展一个类的功能,或给一个类增加附加功能需要
- 2. 动态地给一个对象增加功能,这些功能可以再动态地撤销
- 3. 需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式。
- 角色定义
- Component 抽象构件
- ConcreteComponent 具体构件
- Decorator 装饰角色
- 具体装饰角色:
- 需求背景
- 1. Component 抽象构件:
- 2. ConcreteComponent 具体构件:
- 3. Decorator 装饰角色:
- 4. 具体装饰角色:
- 5. 测试案例:
- 6. 测试结果:
装饰器模式定义:
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活。
使用场景
1、室内装饰:在室内装饰方面,我们可以使用装饰模式来增强房间的美观程度。例如,在客厅中,我们可以使用墙纸、窗帘、地毯等来装饰房间。
2、餐厅装饰:在餐厅装饰方面,我们可以使用装饰模式来增强餐厅的氛围和风格。例如,在餐厅中,我们可以使用花卉、烛台、餐具等来装饰餐厅。
3、节日装饰:在节日装饰方面,我们可以使用装饰模式来增强节日的气氛。例如,在圣诞节,我们可以使用圣诞树、彩灯、雪人等来装饰房间。
4、服装搭配:在服装搭配方面,我们可以使用装饰模式来增强服装的美观程度。例如,在穿搭上,我们可以使用配饰、领带、腰带等来装饰服装。
5、车辆装饰:在车辆装饰方面,我们可以使用装饰模式来增强车辆的美观程度。例如,在汽车上,我们可以使用车贴、轮毂、车身装饰等来装饰车辆。
总结
1. 需要扩展一个类的功能,或给一个类增加附加功能需要
2. 动态地给一个对象增加功能,这些功能可以再动态地撤销
3. 需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式。
角色定义
Component 抽象构件
Component 是一个接口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对象。在装饰模式中,必然有一个最基本、最核心、最原始的接口或抽象类充当 Component 抽象构件。
ConcreteComponent 具体构件
ConcreteComponent 是最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是它。
Decorator 装饰角色
一般是一个抽象类,做什么用呢? 实现接口或者抽象方法,它里面可不一定有抽象的方法呀,在它的属性里必然有一个 private 变量指向 Component 抽象构件
具体装饰角色:
多个具体的装饰类,你要把你最核心的、最原始的、最基本的东西装饰成其他东西
需求背景
在玩QQ飞车这款游戏时,在游戏开始前,我们通常会给爱车进行装饰,比如轮胎、外观、车膜等
1. Component 抽象构件:
public interface Car {
void decorate();
}
2. ConcreteComponent 具体构件:
public class NormalCar implements Car {
@Override
public void decorate() {
System.out.println("这是一辆普通车");
}
}
3. Decorator 装饰角色:
public abstract class CarDecorator implements Car {
protected Car car;
public CarDecorator(Car car) {
this.car = car;
}
@Override
public void decorate() {
car.decorate();
}
}
4. 具体装饰角色:
public class TireDecorator extends CarDecorator {
public TireDecorator(Car car) {
super(car);
}
@Override
public void decorate() {
super.decorate();
addTire();
}
private void addTire() {
System.out.println("添加跑车轮胎");
}
}
public class AppearanceDecorator extends CarDecorator {
public AppearanceDecorator(Car car) {
super(car);
}
@Override
public void decorate() {
super.decorate();
addAppearance();
}
private void addAppearance() {
System.out.println("添加跑车外观");
}
}
public class FilmDecorator extends CarDecorator {
public FilmDecorator(Car car) {
super(car);
}
@Override
public void decorate() {
super.decorate();
addFilm();
}
private void addFilm() {
System.out.println("添加跑车车膜");
}
}
5. 测试案例:
public class Test {
public static void main(String[] args) {
Car car = new NormalCar();
CarDecorator tireDecorator = new TireDecorator(car);
CarDecorator appearanceDecorator = new AppearanceDecorator(tireDecorator);
CarDecorator filmDecorator = new FilmDecorator(appearanceDecorator);
filmDecorator.decorate();
}
}
6. 测试结果:
这是一辆普通车
添加跑车轮胎
添加跑车外观
添加跑车车膜