允许动态的向一个现有对象增加新功能,同时又不改变它的结构,相当于对现有对象的一个包装,因此装饰器模式也被称作包装模式。
装饰器模式中一般存在以下四中角色
- 抽象组件:具体组件和抽象装饰器共同的父类,最基础的组件
- 具体组件:实现抽象构建中声明的方法,装饰器可以给它增加额外的职责
- 抽象装饰器:继承抽象组件并且可以通过构造方法引入具体组件,它的作用主要是组合具体组件
- 具体装饰器:继承抽象装饰器,给组件做不同的装饰。
下面使用一个装饰汽车的实例来实现一下装饰器模式
public interface Car {
/**
* 汽车描述
*/
void describe();
}
汽车下面有两个具体的实现类,分别代表燃油车和新能源车
public class EnergyCar implements Car{
@Override
public void describe() {
System.out.print("新能源汽车");
}
}
public class FuelCar implements Car{
@Override
public void describe() {
System.out.printf("燃油车");
}
}
汽车颜色装饰的抽象类
public class CarColorDecorator implements Car{
private final Car car;
public CarColorDecorator(Car car) {
this.car = car;
}
@Override
public void describe(){
car.describe();
}
}
具体汽车颜色的抽象类,再这里面可以组合相应的组件
public class CarColorDecorator implements Car{
private final Car car;
public CarColorDecorator(Car car) {
this.car = car;
}
@Override
public void describe(){
car.describe();
}
}
具体汽车颜色的实现类,对相应的方法进行修饰增加功能
public class CarRedColorDecorator extends CarColorDecorator{
public CarRedColorDecorator(Car car) {
super(car);
}
@Override
public void describe() {
System.out.printf("红色的");
super.describe();
}
}
测试
public class DecoratorTest {
@Test
public void test(){
Car car = new CarRedColorDecorator(new FuelCar());
car.describe();
}
}
=====结果=====
红色的燃油车
以上看起来装饰器模式和桥接模式有非常大的相似性,那么到底这两种模式有什么区别呢?
- 桥接模式是为了让两个抽象的具体实现能够进行自由的组合,而在某一个抽象类中引入了另一个抽象类,通过抽象类之间的“搭桥”,为其子类相互合作提供了方便。而装饰器模式中一个抽象是另一个抽象的子类,其要目的是为了让装饰器抽象类的实现类可以对被装饰的抽象类的实现类进行装饰。
- 桥接是通过抽象类的组合实现,装饰器是通过抽象之间的组合+继承实现的,桥接相对耦合性更低。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。