解決的問題
為一個類添加更多功能。簡單的情形可以使用繼承。有些復雜的情況使用繼承就比較麻煩了。例如要開發(fā)一個保存數(shù)據(jù)到云端的功能(CloudStream),有些數(shù)據(jù)可以要先加密再保存,有些數(shù)據(jù)可能要先壓縮再保存,有些數(shù)據(jù)可能要壓縮并且加密再保存,諸如此類。這時用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