JAVAデザインパターン-デコレータ

デコレータ

名前から「装飾」を見ると、装飾された人を豊かにすること、つまりオブジェクトに動的に機能を追加することを意味します。

定義

オブジェクトに関数を動的に追加し、デコレータパターンを使用してサブクラスを生成し、関数の拡張をより柔軟にします。

設計の本来の意図:以前の学習で関数を拡張する方法を思い出してください。答えは継承です。しかし、拡張する必要のあるサブクラスが多数ある場合、継承は非常に複雑になります。

実装

また、例としてIphone11と12を使用します。Iphone 12には充電器は付属していませんが、現時点では常に充電器が付属しています。現時点では、メーカーがランダムギフトアクセサリの動的な追加をサポートする必要があります(これは継承では実現できません)。一致する優先アクセサリーをサポートでき、追加のアクセサリーごとに、注文価格が上昇します。

public interface Iphone {
    
    
    double cost();
    String name();
}

public class Iphone12 implements Iphone {
    
      
      
    protected String name; 
    public Iphone12(){
    
      
        name = "Iphone12";  
    }  
  
    @Override  
    public double cost() {
    
      
        return 9000.0;  
    }  
    @Override  
    public String name() {
    
      
        return name;  
    }
}

public class Iphone11 implements Iphone {
    
      
      
    protected String name; 
    public Iphone11(){
    
      
        name = "Iphone11";  
    }  
  
    @Override  
    public double cost() {
    
      
        return 8000.0;  
    }  
  	@Override  
    public String name() {
    
      
        return name;  
    }
}

デコレータ


public abstract class Decorator implements Iphone {
    
      
    public abstract double cost();
    
    public abstract String name();  
  
}

アップルウォッチ

public class Iwatch extends Decorator {
    
      
      
    Iphone iphone;  
      
    public Iwatch(Iphone iphone){
    
      
        this.iphone = iphone;  
    }  
  
    @Override  
    public String name() {
    
      
        return iphone.name()+" 追加Iwatch";  
    }  
  
    @Override  
    public double cost() {
    
      
        return iphone.getPrice()+1500.0;  
    }  
  
}

充電器

public class Charger extends Decorator {
    
      
      
    Iphone iphone;  
      
    public Charger(Iphone iphone){
    
      
        this.iphone = iphone;  
    }  
  
    @Override  
    public String name() {
    
      
        return iphone.name()+" 追加充电器";  
    }  
  
    @Override  
    public double cost() {
    
      
        return iphone.cost()+0.0;//充电器免费  
    }  
  
}
public class Client {

    public static void main(String[] args) {
        Iphone iphone12 = new Iphone12();
        iphone12 = new Iwatch(iphone12);
        Iphone iphone11 = new Iphone11();
        iphone11 = new Charge(iphone11);
        System.out.println(iphone12.name() +"。一共花费:"+ iphone12.cost());
        System.out.println(iphone11.name() +"。一共花费:"+ iphone11.cost());
    }
}

出力

Iphone12 追加Iwatch。一共花费:10500.0
Iphone11 追加充电器。一共花费:8000.0

おすすめ

転載: blog.csdn.net/weixin_43957211/article/details/111213907