今天我们介绍的设计模式叫做装饰器模式,那么什么是装饰器模式,官方给出的解释为:装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。使用装饰器模式可以让我们在不使用继承的情况下动态的给原有的对象添加新的功能。
现在假设我们需要在连接数据库的方法上面添加打印日志的功能。首先我们需要定义一个连接数据库的接口。
public interface DbConnection { public void getConnection(); }
接下来是这个接口的具体实现类:
public class MysqlConnection implements DbConnection{ public void getConnection() { System.out.println("获取了mysql的连接"); } }
定义一个抽象的装饰器类:
public abstract class DbConnectionDecorate implements DbConnection{ protected DbConnection dbconnection; protected DbConnectionDecorate(DbConnection dbconnection){ this.dbconnection = dbconnection; } }
定义一个具体的装饰器:
public class DbConnectionLog extends DbConnectionDecorate{ protected DbConnectionLog(DbConnection dbconnection) { super(dbconnection); } public void getConnection() { this.dbconnection.getConnection(); System.out.println("打印连接数据库日志"); } }
客户端调用:
public static void main(String[] args) { DbConnection connection = new DbConnectionLog(new MysqlConnection()); connection.getConnection(); }
执行结果:
获取了mysql的连接
打印连接数据库日志
装饰器模式在平时的开发中运用的频率很高,其中java中的I/O流就使用了这种设计模式。装饰器模式的本质是在装饰器中定义了目标接口的对象引用然后通过构造方法赋值,在调用方法中先运行原目标接口的实现类的方法在此基础上添加新的功能。