解决的问题
为一个类添加更多功能。简单的情形可以使用继承。有些复杂的情况使用继承就比较麻烦了。例如要开发一个保存数据到云端的功能(CloudStream),有些数据可以要先加密再保存,有些数据可能要先压缩再保存,有些数据可能要压缩并且加密再保存,诸如此类。这时用Decorator Pattern(装饰模式)会比较好。
代码
Stream
:
package com.cong.designpattern.decorator;
public interface Stream {
public void write(String data);
}
CloudStream
:
package com.cong.designpattern.decorator;
public class CloudStream implements Stream{
@Override
public void write(String data) {
System.out.println("Write " + data);
}
}
EncryptedStream
:
package com.cong.designpattern.decorator;
public class EncryptedStream implements Stream{
private Stream stream;
public EncryptedStream(Stream stream) {
this.stream = stream;
}
@Override
public void write(String data) {
String encrypted = data + "[encrypted]";
this.stream.write(encrypted);
}
}
CompressedStream
:
package com.cong.designpattern.decorator;
public class CompressedStream implements Stream{
private Stream stream;
public CompressedStream(Stream stream) {
this.stream = stream;
}
@Override
public void write(String data) {
String compressed = data + "[compressed]";
this.stream.write(compressed);
}
}
Test code:
CloudStream cloudStream = new CloudStream();
EncryptedStream encryptedStream = new EncryptedStream(cloudStream);
CompressedStream compressedStream = new CompressedStream(encryptedStream);
compressedStream.write("1234567890");
UML
Decorator Pattern UML