一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情。
-
装饰模式是动态的给对象添加增强它自身的其他功能。例如我买了一辆车,然后我想改装,轮子换成飞机用的,发送机换成火箭用的。。。
-
代理模式是做一些除了本职的功能外不必关心的事情,例如rpc的调用只关心的是接口的调用,数据怎么通信不用关心;或者是记录日志;
-
当然装饰模式也可以做到,但是两个的侧重点不一样装饰强调的是原有基础上增强功能,代理强调的更多的是对对象的控制完成一些其他的流程。装饰一般是通过继承(对象和真实装饰对象有相同的接口,可以多次装饰)增强、扩展原有功能实现,代理一般是通过系统自带的(Proxy 这个必须由接口类的)或者第三方的cglib(无需接口类)动态代理实现的。
装饰模式的实现demo
汽车改造例子
- Component【car】定义一个对象接口或抽象类,可以给这些对象动态地添加职责。
public interface Car {
public void getDecCar();
}
- Concrete Component【SuvCar】实际被动态地添加职责的对象
public class SuvCar implements Car{
@Override
public void getDecCar() {
System.out.println("四轮越野车");
}
}
- Decorator【CarDecorator】实现了Component【car】接口,用来扩展Component类的功能
public abstract class CarDecorator implements Car {
private Car car;
public CarDecorator(Car car) {
this.car = car;
}
@Override
public void getDecCar() {
car.getDecCar();
}
}
- Concrete Decorator【EngineDecorator】具体装饰者角色
public class EngineDecorator extends CarDecorator{
public EngineDecorator(Car car) {
super(car);
}
public void addEngine() {
System.out.print("航空发动机 ");
}
@Override
public void getDecCar() {
super.getDecCar();
addEngine();
}
}
- 效果
-
装饰的缺点要实现一大堆类,过度的引用会让程序变的复杂
-
java io中的实现是用的装饰模式实现的