06-装饰器模式

06-装饰器模式

1.装饰器模式

public interface IPersonService {

    void getName(String name);
}

public class PersonService implements IPersonService {

    @Override
    public void getName(String name) {
        System.out.println("person name is " + name);
    }
}

public class PersonServiceDecorator implements IPersonService {

    private final IPersonService personService;
    public PersonServiceDecorator(IPersonService personService) {
        this.personService = personService;
    }

    @Override
    public void getName(String name) {
        // 装饰器模式对功能进行增加,姓名为当前类名 + 姓名。
        String newName = this.getClass().getName() + name;
        personService.getName(newName);
    }
}

PersonServiceDecorator decorator = new PersonServiceDecorator(new PersonService());
decorator.getName("tom");

2.装饰器模式在Java中的应用-IO

  1. FilterInputStream类是IO中的核心类,用于增强InputStream子类的功能。
  2. 通过装饰器模式可以给FileInputStream增加不同的功能。
FileInputStream fileInputStream = new FileInputStream("/test.sh");
// 给FileInputStream增加缓存的功能
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
// 给FileInputStream增加按照基本数据类型读取数据的功能
DataInputStream dataInputStream = new DataInputStream(bufferedInputStream);
  1. Java中的IO使用装饰器模式对类的功能进行增强。同时避免了功能增强时类数量的指数级增长。
// 如果直接定义一个类来对FileInputStream进行增强。InputStream的子类是非常多个,
// 如果每个类添加缓冲功能时都通过定义一个类来完成,那么就会导致类的数量指数级增长。
// 所以使用装饰器模式通过组合的方式来为类添加缓存功能,只需要定义BufferedInputStream,
// 然后将需要增加缓冲功能的类通过BufferedInputStream的构造函数传入,就可以为其增加缓冲
// 功能。
BufferedFileInputStream bfis = new BufferedFileInputStream("/test.sh");

3.装饰器模式总结

  1. 装饰器模式和代理模式的异同点。
    1. 装饰器模式和代理模式的代码结构是很相似的,并且功能都是对原始类进行功能的增强。
    2. 装饰器模式和代理模式的区别是应用场景的不同,代理模式附加和原始类不相关的功能,装饰器模式附加与原始类相关的增强功能。
  2. 装饰器模式主要作用是给原始类添加增强功能。在实现上装饰器模式可以通过组合替代继承,来解决继承关系过于复杂的问题。
  3. 装饰器模式可以对原始类嵌套使用多个装饰器类。
posted @ 2022-11-27 08:48  行稳致远方  阅读(27)  评论(0)    收藏  举报