设计模式
本系列文章均是博主原创,意在记录学习上的知识,同时一起分享学习心得。前言
本节介绍装饰器模式的概念、实现方式。
一、装饰器模式概念
装饰器模式主要是解决继承关系过于复杂的问题,通过组合来替代继承。它主要的作用是给原始类添加增强功能。这也是判断是否该用装饰器模式的一个重要依据。除此之外,装饰器模式还有一个特点,那就是可以对原始类嵌套使用多个装饰器。为了满足这个应用场景。在设计的时候,装饰器类和原始类继承相同的抽象类或者接口。
二、实现方式
用一个简单的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();
}
总结
装饰器模式和代理模式实现方式类似,具体区分是从增强的内容出发,装饰器模式的增强内容是跟原有逻辑有关系的,而代理模式则相反。