一、 适用场景
动态地为一个对象增加新的功能。
装饰模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免了产生过多类型。
比如一个汽车,具有行驶的功能。后来业务扩展需要又需要它有飞行、潜水、自动驾驶的功能,如果这些功能都通过继承去实现的话,它们两两组合要写好多的类。
这个时候我们就可以通过装饰模式来解决,能够动态地为其添加新的功能,用到哪些就增加哪些。
二、代码实现
实现要点
- 一个车接口,规定具有的功能
- 一个车的实现类,真实实现车接口的功能
- 一个装饰器类, 其内部包含一个RealCar 对象,用来干活
- 其他具有功能的子类,用来组装新功能。
代码实现
1.实现车接口
public interface Car {
public void run();
}
2.车的实现类,实现车运行的基本功能
public class RealCar implements Car {
@Override
public void run() {
System.out.println("在地上跑");
}
}
3. 车的装饰类
public abstract class DecoratorCar implements Car {
protected Car car;
protected DecoratorCar(Car car) {
this.car = car;
}
@Override
public void run() {
this.car.run();
}
}
4.扩展功能的子类
/**
* 在天上飞的功能的子类
*/
public class FlyCar extends DecoratorCar {
protected FlyCar(Car car) {
super(car);
}
//具有飞的功能
public void fly(){
System.out.println("在天上飞");
}
public void run(){
super.run();
fly();
}
}
/**
* 自动驾驶功能的类
*/
public class AutoCar extends DecoratorCar {
protected AutoCar(Car car) {
super(car);
}
public void autoDrive(){
System.out.println("自动驾驶中");
}
public void run(){
super.run();
autoDrive();
}
}
/**
* 实现潜水功能的子类
*/
public class DiveCar extends DecoratorCar {
protected DiveCar(Car car) {
super(car);
}
public void dive(){
System.out.println("在水下潜行");
}
public void run(){
super.run();
dive();
}
}
测试功能
public class ClientTest {
public static void main(String[] args) {
//测试一个具有走、飞功能的
FlyCar flyCar = new FlyCar(new RealCar());
flyCar.run();
System.out.println("------------");
//嵌套, 测试一个具有走、飞、自动驾驶功能的
AutoCar autoCar = new AutoCar(new FlyCar(new RealCar()));
autoCar.run();
}
}
测试结果
适配器模式 和 装饰器模式是结构型设计模式的基础,掌握了这两个就掌握了结构型设计模式的精髓,其他的模式都是在这个基础上构建起来的。