标签:this ora 构造函数 imp 装饰器模式 装饰器 基本类型 super 默认
装饰器模式主要有以下元素:
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();
    }
}

 
 
 标签:this ora 构造函数 imp 装饰器模式 装饰器 基本类型 super 默认
原文地址:https://www.cnblogs.com/HYV587/p/12664925.html