對於裝飾器和包裝器 和 被修飾類之間的關系 一定是 繼承和實現的關系,具有層次關系
對於裝飾器和包裝器和 代理模式的不同點在於 對於裝飾器和包裝器是在原有功能的基礎上來增加一些新的功能;
其相同點為 : 都是通過外部注入被代理類或被包裝或被修飾類數據
對於相關模板的參考可以通過 (decorator)或(wrapper) 關鍵字進行搜索
例如: org.springframework.http.client.AbstractClientHttpRequestFactoryWrapper 或 org.springframework.core.DecoratingClassLoader
public class CharacterWrapper implements CharSequence { private final CharSequence delegate; public CharacterWrapper(CharSequence delegate) { this.delegate = delegate; } @Override public int length() { return delegate.length(); } @Override public char charAt(int index) { return delegate.charAt(index); } @Override public CharSequence subSequence(int start, int end) { return delegate.subSequence(start, end); } @Override public String toString() { return delegate.toString(); } @Override public IntStream chars() { return delegate.chars(); } @Override public IntStream codePoints() { return delegate.codePoints(); } }
public class DecoratingCharacter implements CharSequence { private final CharSequence decorator; public DecoratingCharacter(CharSequence decorator) { this.decorator = decorator; } /** * 委派{@link CharSequence} 全部的方法 */ @Override public int length() { return decorator.length(); } @Override public char charAt(int index) { return decorator.charAt(index); } @Override public CharSequence subSequence(int start, int end) { return decorator.subSequence(start, end); } @Override public String toString() { return decorator.toString(); } @Override public IntStream chars() { return decorator.chars(); } @Override public IntStream codePoints() { return decorator.codePoints(); } public String getDescription(){ return toString(); } }