设计模式:装饰模式

  装饰模式是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。

 装饰模式功能角色:

  抽象构建角色(Component):真实对象和装饰对象有相同接口。

  具体构建角色(ConcreteComponent):如Io中FileInputStream,

  装饰角色(Decorator):持有一个抽象构建角色的引用。装饰对象接收所有客户端 的请求,并把这些请求转发给真实对象。

            这样在真实对象调用前后增加新的功能。

  具体装饰角色(ConcreteDecorator):复制给构建对象增加新功能

案例:

  

/**
 * 抽象组件
 */
public interface ICar {
    void move();
}

//被裝飾對象
class Car implements ICar {

    @Override
    public void move() {
        System.out.println("陸地上跑");
    }
}
//装饰角色 Decorator
class SuperCar implements ICar {

    private ICar car;

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

    @Override
    public void move() {
        car.move();
    }
}
//具体装饰角色 ConcreteDecorator
class FlyCar extends SuperCar {
    public FlyCar(ICar car) {
        super(car);
    }

    public void fly() {
        System.out.println("fly");
    }

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

}

class WaterCar extends SuperCar {
    public WaterCar(ICar car) {
        super(car);
    }

    public void water() {
        System.out.println("water");
    }

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

}

class AiCar extends SuperCar {
    public AiCar(ICar car) {
        super(car);
    }

    public void ai() {
        System.out.println("auto");
    }

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

}

  

public class Client {

    public static void main(String[] args) {
        Car car = new Car();
        car.move();

        FlyCar flyCar = new FlyCar(car);
        flyCar.move();
        
        WaterCar waterCar =  new WaterCar(car);
        waterCar.move();

        WaterCar waterCar1 = new WaterCar(flyCar);
        waterCar1.move();
    }
}

1.装饰类SuperCar中,持有一个装饰角色对象ICar.

2.此装饰类实现装饰构建ICar接口。

3.装饰模式的对象图从呈链状结构。例子共三个具体装饰类。FlyCar, WaterCar, AiCar.各装饰对象可以相互持有引用或组合。

具体装饰类可将下一个具体装饰类包裹起来,动态增加新的功能。

装饰模式和继承关系的目的都是扩展对象功能,但装饰模式可以提供比继承更多灵活性。

装饰模式允许系统动态决定是否装饰某个类。继承则是在运行前就决定了。

原文地址:https://www.cnblogs.com/gcm688/p/10235648.html