结构型模式——装饰者设计模式

装饰者设计模式允许在不修改原有类代码的情况下,动态为对象添加新的功能。通过创建包装对象来包裹真实对象,例如处理流,提供如缓冲机制等附加职责。它具有低耦合和高内聚的特性,适用于需要扩展类功能的场景。在案例中,为读取文件的类添加缓冲机制,避免了直接修改或继承导致的代码臃肿问题。
摘要由CSDN通过智能技术生成

装饰模式指的是在不必改变原类文件和继承的情况下,动态地扩展一个对象的功能。

它是通过创建一个包装对象,也就是装饰来包裹真实的对象,比如处理流。

应用场景:需要扩展一个类的功能,或给一个类添加附加职责。

优点就是耦合性低,重用性高(高内聚,低耦合)。

案例分析

  • 抽象类ReadFile,用来读取文件,里面有一个抽象方法read
  • 该抽象类有三个子类,分别为读取文本文件类、读取音乐文件类和读取视频文件类
  • 现在提出了新的要求和功能:这三个子类必须各自增加缓冲机制功能,以提高读写效率

按照一般的方法,要么就是分别修改各自的read方法,要么就是再写3个子类去继承重写read,但继承本身就是高耦合的方式,会将父类有用没用的方法都继承过来,从而使程序臃肿。

这里最好的处理办法就是在类内创建父类对象,然后调用其某一个方法,保证高内聚,同时低耦合,也就是装饰者模式。

//ReadFile抽象类
public abstract class FileRead {
    abstract void read();
}

//读取文本文件类
public class FileTextRead extends FileRead {
    String name = "文本";
    @Override
    void read() {
        System.out.println(name + "文件直接读取.....");
    }
}

//读取音乐文件类
public class FileMusicRead extends FileRead {
    String name = "音乐";
    @Override
    void read() {
        System.out.println(name + "文件直接读取.......");
    }
}

//读取视频文件类
public class FileVedioRead extends FileRead {
    String name = "视频";
    @Override
    void read() {
        System.out.println(name + "文件直接读取,......");
    }
}

/**
* 缓冲类,同样继承ReadFile类,但是里面创建了父类对象,可以传入其三个子类对象
* 实现了三个子类各自功能的同时还增加了缓冲机制
*/
public class BufferdFileRead extends FileRead {
    private FileRead fileRead;
	
	//这里会实现多态
    public BufferdFileRead(FileRead fileRead) {
        this.fileRead = fileRead;
    }

    @Override
    void read() {	//这个read方法是缓冲类自己的read
        fileRead.read();	//这个read是传入的FileRead类对象或者其子类对象的read方法
        System.out.println("缓存。。。。。");
    }
}

//测试类
public class test {
    public static void main(String[] args) {
        FileTextRead fileTextRead = new FileTextRead();
        FileMusicRead fileMusicRead = new FileMusicRead();
        FileVedioRead fileVedioRead = new FileVedioRead();

        new BufferdFileRead(fileTextRead).read();
        new BufferdFileRead(fileMusicRead).read();
        new BufferdFileRead(fileVedioRead).read();
    }
}

这种模式,重点在于其设计结构。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值