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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值