装饰器设计模式 用于在运行时修改对象的功能。同时,同一个类的其他实例不会受到影响,因此单个对象获得修改后的行为。装饰器设计模式是结构化设计模式的一种(例如[适配器模式](/community/tutorials/adapter-design-pattern-java)、[桥接模式](/community/tutorials/bridge-design-pattern-java),[复合图案](/community/tutorials/composite-design-pattern-in-java))并使用抽象类或接口与[composition](/community/tutorials/composition-in-java-example)来实现。
装饰器设计模式
我们使用inheritance或组合来扩展对象的行为,但这是在编译时完成的,它适用于类的所有实例。我们不能在运行时添加任何删除任何现有行为的新功能--这是Decorator模式出现的时候。假设我们要实现不同类型的汽车--我们可以创建接口汽车来定义装配方法,然后我们就可以拥有一辆基本车,而且我们可以将其扩展到跑车和豪华车。实现层次结构如下图所示。但如果我们想在运行时获得一辆同时具有跑车和豪华车功能的汽车,那么实现就会变得复杂,如果我们想进一步指定应该首先添加哪些功能,它就会变得更加复杂。现在想象一下,如果我们有十种不同的汽车,使用继承和组合的实现逻辑将无法管理。为了解决这种编程情况,我们在Java中应用了装饰者模式。我们需要有以下类型来实现装饰器设计模式。
1.组件接口 -定义要实现的方法的接口或** 抽象class** 。在我们的例子中,car
将是组件接口。
1Com.Journal aldev.sign.decorator程序包;
2
3公共接口汽车{
4
5公共无效集合(PUBLIC VALID ASSEMBLE);
6}
2.组件实现 -组件接口的基本实现。我们可以使用BasicCar
类作为组件实现。
1Com.Journal aldev.sign.decorator程序包;
2
3公共类BasicCar实现了Car{
4
5@Override
6PUBLIC VID ASSEMBLE(){
7System.out.print();
8}
9
10}
3.Decorator -Decorator类实现Component接口,与Component接口具有-A关系。组件变量应该可以对子修饰器类进行访问,因此我们将使该变量受到保护。
1Com.Journal aldev.sign.decorator程序包;
2
3公共类CarDecorator实现Car{
4
5保护车厢;
6
7公共CarDecorator(Car C){
8This.car=c;
9}
10
11@Override
12PUBLIC VID ASSEMBLE(){
13This.car.assemble();
14}
15
16}
4.混凝土装饰器 -扩展基础装饰器功能,并相应地修改组件行为。具体的装饰类可以有LuxuryCar
和SportsCar
。
1Com.Journal aldev.sign.decorator程序包;
2
3公共类SportsCar扩展CarDecorator{
4
5公共运动车(汽车c){
6超级(Super);
7}
8
9@Override
10PUBLIC VID ASSEMBLE(){
11Super.assemble();
12System.out.print();
13}
14}
15`
16Com.Journal aldev.sign.decorator程序包;
17
18公共类LuxuryCar扩展CarDecorator{
19
20公共豪华汽车(Car C){
21超级(Super);
22}
23
24@Override
25PUBLIC VID ASSEMBLE(){
26Super.assemble();
27System.out.print();
28}
29}
Decorator设计模式-类图
装饰器设计模式测试方案
1package com.journaldev.design.test;
2
3import com.journaldev.design.decorator.BasicCar;
4import com.journaldev.design.decorator.Car;
5import com.journaldev.design.decorator.LuxuryCar;
6import com.journaldev.design.decorator.SportsCar;
7
8public class DecoratorPatternTest {
9
10 public static void main(String[] args) {
11 Car sportsCar = new SportsCar(new BasicCar());
12 sportsCar.assemble();
13 System.out.println("\n*****");
14
15 Car sportsLuxuryCar = new SportsCar(new LuxuryCar(new BasicCar()));
16 sportsLuxuryCar.assemble();
17 }
18
19}
请注意,客户端程序可以在运行时创建不同类型的对象,并且它们还可以指定执行顺序。上述测试程序的输出为:
1Basic Car. Adding features of Sports Car.
2*****
3Basic Car. Adding features of Luxury Car. Adding features of Sports Car.
装饰者设计模式--要点
- Decorator设计模式有助于提供运行时修改能力,因此更加灵活。当选择的数量更多时,它很容易维护和扩展。
- 装饰者设计模式的缺点是它使用了大量类似的对象(装饰者)。
- Decorator模式在Java IO类中大量使用,如FileReader、BufferedReader等。