java设计模式之装饰器模式(包装器模式)

显然设计模式往往追求开闭原则,所以往往是面向接口编程,那么万事万物就是先写接口,把需求弄出来,这里以一辆车子在陆地上跑为基础,对它进行装饰,使它可以具备更多的"功能",达到装饰的效果.这里由于代码相对简单,直接写在一个类里面了

package com.demo.decorator;

/**
 * ICar:抽象构建,面向接口编程,不管三七二十一,来个接口明确要干什么哈
 * 就是实现一个毫无装饰的移动的功能
 *
 * @author zhangxiaoxiang
 * @date 2019/8/9
 */
public interface ICar {
    /**
     * 毫无装饰的陆地上跑的功能
     */
    void move();
}

/**
 * 具体构件角色(真实对象),接口迟早要用于实现的,那这里车就来实现车子移动的接口
 */
class Car implements ICar {
    @Override
    public void move() {
        System.out.println("陆地上跑!");
    }
}

/**
 * Decorator装饰角色
 */
class SuperCar implements ICar {
    /**
     * 子类需要使用,所以使用protected
     * 又是一个典型的接口做属性,典型的开闭原则
     */
    protected 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("天上飞!");
    }

    @Override
    public void move() {
        super.move();
        //拓展功能,装饰
        fly();
    }

}

/**
 * ConcreteDecorator具体装饰角色
 */
class WaterCar extends SuperCar {

    public WaterCar(ICar car) {
        super(car);
    }

    /**
     * 这里进行装饰功能
     */
    public void swim() {
        System.out.println("水上游!");
    }

    @Override
    public void move() {
        super.move();
        //拓展功能,装饰
        swim();
    }

}

/**
 * ConcreteDecorator具体装饰角色
 */
class AICar extends SuperCar {

    public AICar(ICar car) {
        super(car);
    }

    /**
     * 这里进行装饰功能
     */
    public void autoMove() {
        System.out.println("自动跑!");
    }

    @Override
    public void move() {
        super.move();
        //拓展功能,装饰
        autoMove();
    }

}

再测试一下

package com.demo.decorator;

/**
 * Client:装饰器测试
 *
 * @author zhangxiaoxiang
 * @date 2019/8/9
 */
public class Client {
    public static void main(String[] args) {
        System.out.println("------------------来一个常规无装饰的操作------------------------");
        Car car = new Car();
        car.move();

        System.out.println("------------------增加新的功能,飞行---------------------------");
        FlyCar flycar = new FlyCar(car);
        flycar.move();

        System.out.println("------------------增加新的功能,水里游--------------------------");
        WaterCar waterCar = new WaterCar(car);
        waterCar.move();

        System.out.println("------------------增加两个新的功能,飞行,水里游-----------------");
        //这里也可以叫包装2下
        WaterCar waterCar2 = new WaterCar(new FlyCar(car));
        waterCar2.move();

//		JDK使用装饰器,下面的写法是不是很熟悉
//		Reader r = new BufferedReader(new InputStreamReader(new FileInputStream(new File("d:/a.txt"))));

    }
}

测试结果

发布了57 篇原创文章 · 获赞 33 · 访问量 814万+

猜你喜欢

转载自blog.csdn.net/wozniakzhang/article/details/99062657