装饰器

装饰模式(Decorator Pattern),强调的是对对象的功能增强。

其中在 JDK 中体现最明显的类就是与 I/O 相关的类,如 BufferedReader、InputStream、OutputStream 及它们的子类。

组合各种类型的字节流,使用

//读取文件 + 可缓存的字节流
new BufferedInputStream(new FileInputStream("D:/c.txt"));
//读取文件 + 直接读取基本类型的字节流
new DataInputStream(new FileInputStream("D:/c.txt"));

IUserDao

public interface IUserDao {
    void save();
}

UserDao

public class UserDao implements IUserDao {
    @Override
    public void save() {
        System.out.println("----已经保存数据!----");
    }
}

UserDaoTxDecorator

public class UserDaoTxDecorator implements IUserDao {

    private IUserDao target;

    public UserDaoTxDecorator(IUserDao target){
        this.target = target;
    }

    @Override
    public void save() {
        System.out.println("开始事务...");
        target.save();
        System.out.println("提交事务...");
    }
}

UserDaoLogDecorator

public class UserDaoLogDecorator implements IUserDao {

    private IUserDao target;

    public UserDaoLogDecorator(IUserDao target){
        this.target = target;
    }

    @Override
    public void save() {
        System.out.println("记录开始日志...");
        target.save();
        System.out.println("记录结束日志...");
    }
}

测试

public class App {
    public static void main(String[] args) {

        //被装饰对象
        IUserDao userDao = new UserDao();

        //事务装饰
        UserDaoTxDecorator txDecorator = new UserDaoTxDecorator(userDao);

        //日志装饰
        UserDaoLogDecorator logDecorator = new UserDaoLogDecorator(txDecorator);

        logDecorator.save();
    }
}

参考

装饰器模式在JDK源码中的应用

Java设计模式(六) 代理模式 vs. 装饰模式

版权

评论