作用
- 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活
何时使用
- 在不想增加很多子类的情况下扩展类
优点
- 装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能
实例
结构图
/**
* @Author: create_By: chenxin
* @Data:Created in 2018/8/31 16:42
* @Version:
* @Acton: 抽象组件
*/
public interface Icar {
void move();
}
/* 具体对象 */
class Car implements Icar{
@Override
public void move() {
System.out.println("地上跑");
}
}
class SuperCar implements Icar{
protected Icar car;
public SuperCar(Icar car) {
this.car = car;
}
@Override
public void move() {
car.move();
}
}
class AICar extends SuperCar{
public AICar(Icar car) {
super(car);
}
public void autoMove(){
System.out.println("自动移动");
}
@Override
public void move() {
super.move();
autoMove();
}
}
class FlyCar extends SuperCar{
public FlyCar(Icar car) {
super(car);
}
public void fly(){
System.out.println("我会飞了");
}
@Override
public void move() {
super.move();
fly();
}
}
class WaterCar extends SuperCar{
public WaterCar(Icar car) {
super(car);
}
public void swing(){
System.out.println("我会游泳了");
}
@Override
public void move() {
super.move();
swing();
}
}
public class TestDecoratorDemo {
public static void main(String[] args){
Car car = new Car();
/* 增加一个功能 */
FlyCar flyCar = new FlyCar(car);
flyCar.move();
/* 增加一个功能 */
WaterCar waterCar = new WaterCar(flyCar);
waterCar.move();
/* 两个 */
//================#================
System.out.println("#====================?====================");
AICar aiCar = new AICar(new FlyCar(waterCar));
aiCar.move();
}
}
结构图