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