理解设计模式之装饰模式
装饰模式 Decorator Pattern
本文重在理解,代码点到为止。何为装饰?从生活中我们知道,要装饰一样物品,肯定是在原物品之上添加一些额外的东西去点缀它,让原来的物品看起来更美好。设计模式中的装饰模式原理跟生活中的装饰原理一样,首先是有一样原物品,其次是在原物品之上做一些优化和增强。为什么要使用装饰模式?因为装饰模式在不改变原有类的结构和业务逻辑的条件下,对原有类的功能进行扩展。个人觉得装饰模式的主要作用就是对原有类进行功能增强,目的很简单,所以这个模式是最容易理解的模式之一。
装饰模式有一个共同点,就是被装饰的类一定是有一个功能接口,这个模式是面向接口编程IOP的一种体现,不建议装饰模式基于继承的方式来实现,这会让类之间耦合度增加,不利于扩展。下面是一个简单的装饰模式UML类图:
装饰模式其实用的地方也不少,最常见的,大概就是数据库连接池了,这个是非常常用的一种技术。拿阿里开源的Druid数据库连接池举例,Druid的DruidPooledConnection就是典型的装饰模式,数据库连接对象接口是java.sql.Connection对象,具体的Connection实现类根据数据库驱动的不同而不同,例如基于Oracle实现的Connection和基于MySQL实现的Connection,Druid连接池对内部的具体Connection做了大量的功能增强,使其具有更强大的功能。
总结
装饰模式是最容易理解的模式之一,是属于结构模式类,是面向接口编程思想的实践,最重要的概念是装饰模式在不改变原有类的结构和业务逻辑的条件下,对原有类进行功能增强。与之相似的一个设计模式叫代理模式,但是两者设计的出发点不一样,后面会对代理模式进行专门介绍。