- 装饰模式是动态的给对象添加增强它自身的其他功能。例如我买了一辆车,然后我想改装,轮子换成飞机用的,发送机换成火箭用的。。。
- 代理模式是做一些除了本职的功能外不必关心的事情,例如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中的实现是用的装饰模式实现的
网络异常,图片无法展示
|