给某个对象,动态新增功能。
构成:
1、抽象接口:真实对象与装饰对象实现同一个接口。
2、装饰父类:持有一个真实对象的引用,即可为真实对象新增功能。
3、真实对象:被扩展的对象。
4、装饰对象:继承装饰父类,负责添加功能的装饰对象。
比如:
我有一个IO输出流,它只能写入字节数据。真实对象:FileOutputStream
我需要新增传写入对象的功能。则需要一个装饰对象:ObjectOutputStream
使用起来就是:
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(new File(data)));
oos.writeObject(obj);
又比如:
车车都实现了InCar接口。
我有一辆普通的车车,它只能在路上跑。真实对象:Car
我需要新增飞起来的功能,自动驾驶的功能。需要两个装饰对象:FlyCar、AiCar
使用起来就是:
AiCar ac = new AiCar(new FlyCar(new Car())); ac.ai();
例子
抽象角色:
/** * Component 抽象角色:真实对象与装饰对象实现同一个接口。 */ public interface InCAr { void run();//车都会跑 }
真实对象:被扩展的对象
class Car implements InCAr{ @Override public void run() { System.out.println("平平无奇小车车跑起来了。"); } }
装饰角色:持有一个抽象构件的引用,即可新增功能。
class SuperCar implements InCAr{ private InCAr car;//持有一个抽象构件的引用,即可新增功能。 public SuperCar(InCAr car) { this.car = car; } @Override public void run() { car.run(); } }
装饰对象一:新增飞行功能
具体的装饰类,继承了装饰角色,通过super可调用run方法,即保留了原来的功能,又新增了新的功能。可以在共同方法中实现多重复合。
class FlyCar extends SuperCar{ public FlyCar(InCAr cAr) { super(cAr); } //新增飞的功能 public void fly(){ System.out.println("飞起来了。"); } @Override public void run() {//同一个方法支持复合添加功能 fly(); super.run(); } }
装饰对象二:新增自动驾驶功能
class AiCar extends SuperCar{ public AiCar(InCAr cAr) { super(cAr); } //新增自动驾驶的功能 public void ai(){ System.out.println("Ai操控中。"); } @Override public void run() {//同一个方法支持复合添加功能 ai(); super.run(); } }
测试:
public class CLient { public static void main(String[] args) throws Exception { //普通的车车 Car car = new Car(); car.run(); System.out.println("--------------------");
//创建一个会飞的车车 FlyCar flyCar = new FlyCar(car); flyCar.fly();//新增方法 System.out.println("--------------------");
flyCar.run();//共同方法,新增飞 System.out.println("--------------------");
//创建一个自动驾驶,且会飞的车 AiCar aiCar = new AiCar(new FlyCar(car)); aiCar.ai();//新增方法
System.out.println("--------------------");
aiCar.run();//共同方法,新增自动驾驶、飞 } }
运行结果:
标签:run,对象,car,模式,public,new,装饰,Decorator From: https://www.cnblogs.com/lurenjia-bky/p/16925473.html