23种设计模式之装饰器模式

codercheng 2020-04-09

装饰器模式主要有以下元素:

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();    }}
 
 
 

相关推荐