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