一 作用

职责:动态的为一个对象增加新的功能

装饰器模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。

 

二、创建抽象组件接口

Component抽象构件角色:真实对象和装饰对象有相同的接口。这样,客户端对象就能够以与真实对象相同的方式同装饰对象交互。

public interface ICar {
    void move();
}

三、构建具体角色

具体构件角色(真实对象)

public class Car implements ICar{
    @Override
    public void move() {
        System.out.println("在陆地上跑");
    }
}

 

装饰角色:持有一个抽象构件的引用。装饰对象接受所有客户端的请求,并把这些请求转发给真实的对象。这样,就能在真实对象调用前后增加新的功能。

public class SuperCar implements ICar{
    private ICar iCar;

    public SuperCar(ICar iCar){
        this.iCar = iCar;
    }

    @Override
    public void move() {
        iCar.move();
    }
}

 

具体装饰角色:负责给构件对象增加新的责任。

public class FlyCar extends SuperCar{

    public FlyCar(ICar iCar) {
        super(iCar);
    }

    public void fly(){
        System.out.println("在天上飞的汽车");
    }

    @Override
    public void move() {
        super.move();
        fly();
    }
}

 

 

public class WaterCar extends SuperCar{

    public WaterCar(ICar iCar) {
        super(iCar);
    }

    public void water(){
        System.out.println("在水里游");
    }
    @Override
    public void move() {
        super.move();
        water();
    }
}

 

 

 

具体装饰角色
public class WaterCar extends SuperCar{

    public WaterCar(ICar iCar) {
        super(iCar);
    }

    public void water(){
        System.out.println("在水里游");
    }
    @Override
    public void move() {
        super.move();
        water();
    }
}

四、创建测试类


public class DecoratorTest {

public static void main(String[] args) {
Car car = new Car();
car.move();
System.out.println("_______________________________________________________");

//增加一个可以飞行的功能
FlyCar flycar = new FlyCar(car);
flycar.move();
System.out.println("_______________________________________________________");

//增加一个可以下水跑的功能
WaterCar waterCar = new WaterCar(car);
waterCar.move();
System.out.println("_______________________________________________________");

//增加可以飞行同时也可以下水跑的功能
WaterCar waterCar2 = new WaterCar(new FlyCar(car));
waterCar2.move();
System.out.println("_______________________________________________________");

}
}
 

五、效果图

陆地上跑
_______________________________________________________
陆地上跑
在天上飞的汽车
_______________________________________________________
陆地上跑
在水里游
_______________________________________________________
陆地上跑
在天上飞的汽车
在水里游
_______________________________________________________

 

 

六、实际应用

 

七、总结

装饰模式(Decorator)也叫包装器模式(Wrapper);

装饰模式降低系统的耦合度,可以动态的增加或删除对象的职责,并使得需要装饰的具体构建类和具体装饰类可以独立变化,以便增加新的具体构建类和具体装饰类。

优点:

  • 扩展对象功能,比继承灵活,不会导致类个数急剧增加
  • 可以对一个对象进行多次装饰,创造出不同行为的组合,得到功能更加强大的对象
  • 具体构建类和具体装饰类可以独立变化,用户可以根据需要自己增加新的具体构件子类和具体装饰子类

  缺点:

  • 产生很多小对象。大量小对象占据内存,一定程度上影响性能
  • 装饰模式易于出错,调试排查比较麻烦