JAVA设计模式 - 装饰者(Decorator)

装饰者(Decorator)

从名字上看“装饰”,就是让被装饰者更加丰富,即为对象动态添加功能。

Definition

为对象动态的添加功能,使用装饰者模式生成子类的方法让功能的拓展变得更灵活。

设计的初衷:回想一下在我们以前的学习中如何去拓展一个功能,答案是:继承。但是当需要扩展的子类很多的时候,继承就会变得十分复杂。

Implementation

同样用Iphone11和12来做例子。 购买Iphone12不会赠送充电器,然而以前都是会附带有充电器的,这时候厂商就有必要支持动态添加随机赠送配件(这是继承实现不了的)。可以支持搭配优惠配件,每增加一种配件,订单价格就会增加。

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