概念
デコレータパターン(デコレータパターン)は、ラッパーパターン(ラッパーパターン)とも呼ばれ、元のオブジェクトを変更せずにオブジェクトに関数を追加することを指します。このタイプの設計パターンは、既存のクラスのラッパーとして機能する構造パターンに属しています。
デコレータパターンには、主に4つの役割が含まれます。
- 抽象コンポーネント(コンポーネント):これは、装飾されたクラスの元のオブジェクトとして機能し、装飾されたオブジェクトの動作を指定するインターフェイスまたは抽象クラスにすることができます。
- コンクリートコンポーネント(ConcreteComponent):装飾されたオブジェクトであるComponentを実装または継承するコンクリートオブジェクト
- 抽象デコレータ(デコレータ):ConcreteComponentの一般的なデコレータ。コンポーネント抽象コンポーネントを指す属性が必要です。
- コンクリートデコレータ(ConcreteDecorator):デコレータの具体的な実現クラス
成し遂げる
例として、パイ、卵、ハムを見てみましょう。
1.抽象的なコンポーネントを作成します
public abstract class Pancake {
abstract String name();
}
2.特定のコンポーネントを作成します
public class BasePancake extends Pancake {
@Override
String name() {
return "素煎饼";
}
}
3.抽象的なデコレータを作成します
public abstract class PancakeDecorator extends Pancake{
private Pancake pancake;
public PancakeDecorator(Pancake pancake) {
this.pancake = pancake;
}
String name(){
return this.pancake.name();
}
}
4.具体的なデコレータを作成します
public class EggDecorator extends PancakeDecorator {
public EggDecorator(Pancake pancake) {
super(pancake);
}
String name(){
return super.name()+"+鸡蛋";
}
}
public class SausageDecorator extends PancakeDecorator {
public SausageDecorator(Pancake pancake) {
super(pancake);
}
String name(){
return super.name()+"+火腿肠";
}
}
5.テスト
public class DecoratorTest {
public static void main(String[] args) {
Pancake pancake=new BasePancake();
//加鸡蛋
pancake=new EggDecorator(pancake);
//再加鸡蛋
pancake=new EggDecorator(pancake);
//再加香肠
pancake=new SausageDecorator(pancake);
System.out.println(pancake.name());
}
}
動作結果:
使用するシーン
- クラスの機能を拡張する
- 動的増加機能、動的キャンセル
ソースコードで使用
前述のMybatisソースコードには、キャッシュインターフェイスキャッシュ
があります。名前から理解できます。たとえば、FifoCacheはファーストインファーストアウトキャッシュ、BlockingCacheはブロッキングキャッシュなど、すべてデコレータモードを採用しています。
デコレータモードとプロキシモードの違い
- デコレータはそれ自体の機能の拡張を強調し、エージェントモードはエージェントプロセスの制御を強調します
総括する
利点
- さまざまな装飾と、これらの装飾の並べ替えと組み合わせを使用することで、さまざまな効果を実現できます。
- 元のオブジェクトを変更せずに、関数をオブジェクトに動的に拡張します
不利益
- 多層装飾の場合はさらに複雑になります