设计模式之装饰模式

来源:互联网 发布:linux运维个人简历 编辑:程序博客网 时间:2024/06/08 09:16

设计模式之装饰模式

装饰模式的简单介绍

通常来说,我们要扩展一个类的功能,可以有两种方式,一种是继承该类,并且增加新的功能;另外一种就是采用装饰模式,在设计的时候,让该类本身具有动态扩展性,在以后需要扩展新功能的时候,可以动态地进行扩展,经常使用到的I/O流就是装饰模式的典型应用了。

装饰模式的具体实现

这里通过一个汽车的案例来深入学习装饰模式,假设有一种汽车,只能够在陆地上跑,但是可以为其添加新的功能,使其具有其他的能力,比如飞行、在海面行走等,使用普通的方法来实现就是为其定义多个子类,比如飞行功能的汽车,在海面行走的汽车,具有飞行以及在海面行走的汽车…可以看到,当其能力比较多的时候,需要派生非常多的子类,这个时候就比较痛苦了,而且,不一定扩展出来的类就需要用到,这就会带来很大的冗余了;使用装饰模式则可以避免这样的问题出现。

// 首先我们应该具有普通的汽车/** * 抽象汽车类 */abstract class Car {   public abstract void run();}/** * 普通的汽车 */class OrdinaryCar extends Car{    @Override    public void run() {        System.out.println("在陆地上跑的功能");    }}// 然后需要具有扩展能力的汽车,方便进行扩展/** * 具有扩展能力的汽车 */abstract class XCar extends Car{    private Car car;    public XCar(Car car) {        this.car = car;    }    // 扩展新能力    protected abstract void otherFunction();    @Override    public void run() {        car.run();        otherFunction();    }}/** * 飞行功能 */class FlyingCar extends XCar{    public FlyingCar(Car car) {        super(car);    }    @Override    protected void otherFunction() {        System.out.println("飞行功能");    }}/** * 海面行走功能 */class SwimmingCar extends XCar{    public SwimmingCar(Car car) {        super(car);    }    @Override    protected void otherFunction() {        System.out.println("海面行走功能");    }}

如上所示,我们定义了普通的汽车,具有扩展能力的汽车以及一些对应的功能,比如飞行、海面行驶等。接下来,客户就可以根据需要进行组合了

Car car = new OrdinaryCar(); // 普通汽车FlyingCar fcar = new FlyingCar(car); // 具有飞行功能的汽车SwimmingCar scar = new SwimmingCar(new FlyingCar(new Car())) // 具有飞行功能以及海面行驶功能的汽车

可以看到,无论功能多么复杂,只需要定义基本的功能,然后根据需要进行组合即可,不再需要为各种功能的组合定义对应的类了,当想要增加新的功能的时候,也只需要定义新的功能,就可以与之前的功能无缝对接了。

总结

装饰模式,是一种具有动态扩展类功能的模式,适合用于功能或者说选择比较多的情况下,通过装饰模式,可以根据需要进行功能的组合,而不需要为其定义庞大的子类,而且在需要增加新的功能的时候,直接通过这种方式,原有的功能全部无需改动,而可以使得原有的产品具有新增加的功能。

原创粉丝点击