装饰模式简单介绍

184 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情

  • 装饰模式是动态的给对象添加增强它自身的其他功能。例如我买了一辆车,然后我想改装,轮子换成飞机用的,发送机换成火箭用的。。。

  • 代理模式是做一些除了本职的功能外不必关心的事情,例如rpc的调用只关心的是接口的调用,数据怎么通信不用关心;或者是记录日志;

  • 当然装饰模式也可以做到,但是两个的侧重点不一样装饰强调的是原有基础上增强功能,代理强调的更多的是对对象的控制完成一些其他的流程。装饰一般是通过继承(对象和真实装饰对象有相同的接口,可以多次装饰)增强、扩展原有功能实现,代理一般是通过系统自带的(Proxy 这个必须由接口类的)或者第三方的cglib(无需接口类)动态代理实现的。

装饰模式的实现demo

image.png

汽车改造例子

  • 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();
	}
}
  • 效果

image.png

  • 装饰的缺点要实现一大堆类,过度的引用会让程序变的复杂

  • java io中的实现是用的装饰模式实现的

image.png