装饰器模式

设计模式

本系列文章均是博主原创,意在记录学习上的知识,同时一起分享学习心得。

24种设计模式



前言

本节介绍装饰器模式的概念、实现方式。


一、装饰器模式概念

装饰器模式主要是解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。这也是判断是否该用装饰器模式的一个重要依据。除此之外,装饰器模式还有一个特点,那就是可以对原始类嵌套使用多个装饰器。为了满足这个应用场景。在设计的时候,装饰器类和原始类继承相同的抽象类或者接口。

二、实现方式

用一个简单的IO类以及其子类,来表达装饰器模式。

/**
*顶层接口
**/
public interface InStream {

    void read();

    void write();

    void clear();

    void delete();
}
/**
* 子类
**/
public class FileInputStream implements InStream {
    @Override
    public void read() {
        System.out.println("file read...");
    }

    @Override
    public void write() {
        System.out.println("file write...");

    }

    @Override
    public void clear() {
        System.out.println("file clear...");

    }

    @Override
    public void delete() {
        System.out.println("file delete...");

    }
}
/**
* 装饰器类1,增强了FileInputStream的功能
**/
public class DataInStream implements InStream {
    InStream in;

    public DataInStream(InStream in) {
        this.in = in;
    }

    @Override
    public void read() {
        System.out.println("data read");
        in.read();
    }

    @Override
    public void write() {
        System.out.println("data write");
        in.write();
    }

    @Override
    public void clear() {
        System.out.println("data clear");
        in.clear();
    }

    @Override
    public void delete() {
        System.out.println("data delete");
        in.delete();
    }
}
/**
* 装饰器类2,增强了FileInputStream的功能
**/
public class FileInputStream implements InStream {
    @Override
    public void read() {
        System.out.println("file read...");
    }

    @Override
    public void write() {
        System.out.println("file write...");

    }

    @Override
    public void clear() {
        System.out.println("file clear...");

    }

    @Override
    public void delete() {
        System.out.println("file delete...");

    }
}
// 测试方法
@Test
public void test() {
    InStream in = new FileInputStream();
    InStream bufferIn = new BufferInStream(in);
    InStream data = new DataInStream(bufferIn);
    bufferIn.read();
    System.out.println("--------------");
    bufferIn.write();
    System.out.println("--------------");
    bufferIn.clear();
    System.out.println("--------------");
    bufferIn.delete();
    System.out.println("--------------");
    data.read();
    System.out.println("--------------");
    data.write();
    System.out.println("--------------");
    data.clear();
    System.out.println("--------------");
    data.delete();
}

在这里插入图片描述


总结

装饰器模式和代理模式实现方式类似,具体区分是从增强的内容出发,装饰器模式的增强内容是跟原有逻辑有关系的,而代理模式则相反。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值