03. Decorator Pattern


オブジェクトに追加の責任を動的に付与
継承なしで柔軟かつ柔軟に機能を拡張
  • コンポーネント:各コンポーネントは、直接書き込むことも、レコーダによって包むこともできる(クラスまたはインタフェース)
  • .
  • 機密コンポーネント:新しい動作を動的に追加
  • Decorator:インタフェースまたは抽象クラス
  • 、装飾するコンポーネントなど
  • ConcreteDecorator:オブジェクトが装飾された
  • 例-スターバックス飲料


  • Component
    デフォルトクラス-
  • を継承
    public abstract class Beverage {
        private String description = "제목 없";
    
        public void setDescription(String description) {
            this.description = description;
        }
    
        public String getDescription() {
            return description;
        }
    
        public abstract double cost();
    }
    
  • concreteComponent
  • public class HouseBlend extends Beverage{
    
        public HouseBlend() {
            super.setDescription("하우스 블렌드 커피");
        }
    
        @Override
        public double cost() {
            return .89;
        }
    }
  • Decorator
    抽象クラス
  • を採用
    public abstract class CondimentDecorator extends Beverage {
        public abstract String getDescription();
    }
  • ConcreteDecorator
  • public class Mocha extends CondimentDecorator{
        private Beverage beverage;
        
        public Mocha(Beverage beverage) {
            this.beverage = beverage;
    
        }
    
        @Override
        public double cost() {
            return  beverage.cost() + .20;
        }
    
        @Override
        public String getDescription() {
            return beverage.getDescription() + ", 모카";
        }
    }
  • Main
  • public class Main {
        public static void main(String[] args) {
            Beverage beverage = new HouseBlend();
            beverage = new Mocha(beverage); // 데코레이터로 beverage 감싼다.
    
            System.out.println(beverage.getDescription());
        }
    }