/** * 装饰模式 * * 类似于代理模式 * 与代理的区别: * 1、真实角色持有(?) * 代理:代理角色并不一定需要调用者提供真实角色(调用者不需要持有真实角色) * 装饰:调用者需要持有真实角色,并提供给装饰器 * 2、真实角色控制 * 代理:代理角色返回任意真实角色,甚至不返回真实角色 * 装饰:对传入的真实角色进行装饰,然后将装饰后的角色返回 * * 代理:我通过 代理(代理角色) 买一套精装修的房子 * 装饰:我先买房,再找 人(装饰角色) 给我装修 */ public class DecoratorDemo01 { public static void main(String[] args) { ICar car = new SuperCar(); System.out.println("***********************"); car.move(); System.out.println("***********************"); new FlyCar(car).move(); System.out.println("***********************"); new SwimCar(car).move(); System.out.println("***********************"); new FlyCar(new SwimCar(car)).move(); System.out.println("***********************"); new SwimCar(new FlyCar(car)).move(); System.out.println("***********************"); } } /** * 统一接口 */ interface ICar{ public void move(); } /** * 被装饰对象 */ class SuperCar implements ICar{ @Override public void move() { System.out.println("汽车运行"); } } /** * 一下为装饰器 */ class FlyCar implements ICar{ private ICar car; public FlyCar(ICar car){ this.car = car; } @Override public void move(){ System.out.println("汽车安装了翅膀"); car.move(); } } class SwimCar implements ICar{ private ICar car; public SwimCar(ICar car){ this.car = car; } @Override public void move(){ System.out.println("汽车安装了气垫"); car.move(); } }
运行结果:
*********************** 汽车运行 *********************** 汽车安装了翅膀 汽车运行 *********************** 汽车安装了气垫 汽车运行 *********************** 汽车安装了翅膀 汽车安装了气垫 汽车运行 *********************** 汽车安装了气垫 汽车安装了翅膀 汽车运行 ***********************