装饰器模式主要有以下元素:
1.Component为统一接口,也是装饰类和被装饰类的基本类型。
2.ConcreteComponent为具体实现类,也是被装饰类,他本身是个具有一些功能的完整的类。
3.Decorator是装饰类,实现了Component接口的同时还在内部维护了一个ConcreteComponent的实例,并可以通过构造函数初始化。而Decorator本身,通常采用默认实现,他的存在仅仅是一个声明:我要生产出一些用于装饰的子类了。而其子类才是赋有具体装饰效果的装饰产品类。
4.ConcreteDecorator是具体的装饰产品类,每一种装饰产品都具有特定的装饰效果。可以通过构造器声明装饰哪种类型的ConcreteComponent,从而对其进行装饰。
以上4点可以说是设计装饰器模式需要的条件及思路。
优点:
装饰器模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀。
案列:
/*
1.装饰器模式-compoment接口
*/
public interface Icar {
void move();
}
/*
2.装饰器模式-ConcreteComponent具体构建角色(真实对象)
被装饰类 角色
*/
class Car implements Icar {
@Override
public void move() {
System.out.println("陆地上跑");
}
}
/**
*3. Decorator 装饰类 实现接口并内部维护一个ConcreteComponent实例(被装饰类)
*/
class SuperCar implements Icar {
private Icar car;
public SuperCar(Icar car){
this.car=car;
}
@Override
public void move() {
car.move();
}
}
4.//ConcreteDecorator具体装饰角色
class FlyCar extends SuperCar{
public FlyCar(Icar car) {
super(car);
}
public void fly(){
System.out.println("天上飞");
}
@Override
public void move() {
super.move();
fly();
}
}
4.//ConcreteDecorator具体装饰角色
class WaterCar extends SuperCar{
public WaterCar(Icar car) {
super(car);
}
public void swim(){
System.out.println("水里游");
}
@Override
public void move() {
super.move();
swim();
}
}
5.测试
public class Test{
public static void main(String[] args){
Icar car=new Car();
car.move();
System.out.println("-----增加新功能(装饰效果)");
Icar flycar=new FlyCar(car);
flycar.move();
System.out.println("-----增加新功能(装饰效果)");
Icar watercar=new WaterCar(car);
watercar.move();
System.out.println("-----增加2个新功能(装饰效果)");
Icar watercar2=new WaterCar(flycar);
watercar2.move();
}
}
![](https://img2020.cnblogs.com/blog/1858192/202004/1858192-20200409100413968-892070720.png)