[Design pattern] Decorator Pattern 📿, (Structural patterns)


Decorator pattern 📿


基本オブジェクトのモードに追加機能を動的に柔軟に追加

  • 長所
  • オブジェクトのダイナミック(ダイナミック)、機能の追加が容易

  • 短所
  • Decoratorクラスが増加するにつれて、クラスが増加する可能性があります.
  • 使用状況


    GUIツールパッケージでは、スクロールなどの動作または属性(borderなど)をユーザーインタフェース要素にのみ追加する場合は、他の責任を負うためにオブジェクトに属性を追加する必要があります.
    つまり、クラス全体に新しい機能を追加する必要はありませんが、単一のオブジェクトに新しい責任を追加する必要がある場合に使用できます.
    Java APIファイルI/O関連部分でも使用されます.👇
    BufferedReader bufferedreader = new BufferedReader(new FileReader(new File("daydream.txt")));

    こうぞう



  • Tree
  • DefaultTreeおよびDecoratorが実装するインタフェース

  • DefaultTree
  • Decorate受信対象
  • 機能追加のデフォルトオブジェクト

  • Decorator
    装飾するオブジェクトの抽象クラス
  • 機能を追加するオブジェクトは、DefaultTreeを継承します.

  • Red, Blue
  • Decoratorが引き継いで実施する各種機能オブジェクト
  • DefaultTreeに追加するために作成されます.

  • DecoratorPattern
  • プライマリメソッド呼び出しクラス
  • インプリメンテーション🛠

  • Tree
  • interface Tree {
    
    	String decorate();
    
    }
  • DefaultTree
  • class DefaultTree implements Tree {
    
    	@Override
    	public String decorate() {
    		return "Tree";
    	}
    
    }
  • Decorator
  • abstract class Decorator implements Tree {
    
    	private Tree tree;
    
    	public Decorator(Tree tree) {
    		this.tree = tree;
    	}
    
    	@Override
    	public String decorate() {
    		return tree.decorate();
    	}
    
    }
  • Red, Blue
  • class Red extends Decorator {
    
    	public Red(Tree tree) {
    		super(tree);
    	}
    
    	public String addRed() {
    		return " with Red";
    	}
    
    	@Override
    	public String decorate() {
    		return super.decorate() + addRed();
    	}
    
    }
    
    class Blue extends Decorator {
    
    	public Blue(Tree tree) {
    		super(tree);
    	}
    
    	public String addBlue() {
    		return " with Blue";
    	}
    
    	@Override
    	public String decorate() {
    		return super.decorate() + addBlue();
    	}
    
    }
  • DecoratorPattern
  • public class DecoratorPattern {
    
    	public static void main(String[] args) {
    
    		Tree tree = new DefaultTree();
    		System.out.println(tree.decorate());
    
    		Tree treeWithRed = new Red(new DefaultTree());
    		System.out.println(treeWithRed.decorate());
    
    		Tree treeWithRedWithBlue = new Blue(new Red(new DefaultTree()));
    		System.out.println(treeWithRedWithBlue.decorate());
    	}
    
    }

    実行結果🧐

    Tree
    Tree with Red
    Tree with Red with Blue
  • superまずツリーの操作(装飾)
  • を実行する.
    上記の結果のように、新しい機能を柔軟に作成および追加できます.