个人理解: 装饰模式,是对原有功能上的一种增强。
以下情况使用Decorator模式
1. 需要扩展一个类的功能,或给一个类添加附加职责。
2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。
3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
4. 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类 定义被隐藏,或类定义不能用于生成子类。
UML图:
代码案例:
一个商场收费案例。
IShopCharge: 商场收费计费接口 +charge()
ShopChargeGeneral: 无任何装饰增强,常规计费(该多少就多少)
AShopChargePrivilege: 商场收费,优惠计费抽象类 实现 IShopCharge
// 因为是在原有的计费基础上的装饰增前,所以需要,依赖注入原始计费实现。
-IShopCharge shopCharge;
+setShopCharge(IShopCharge shopCharge)
//重写原有计费接口实现
+charge();
ShopCharegeReturn: 商场收费,优惠返现计费实现类 继承优惠计费抽象类
-double bCost; //返现基准
-double rCost //返现额
+charge() //重写计费实现.
ShopChargeDiscount 商场收费,优惠打折计费实现类 继承优惠计费抽象类
-double discountNum //折扣率
+charge() 重写计费实现
代码:
IShopCharge 接口
<pre name="code" class="html">package com.bo.decorator;
public interface IShopCharge {
public double charge();
}
ShopChargeGeneral 普通计费实现类代码:
package com.bo.decorator;
/**
* 商场正常收费
* @author 波
*
*/
public class ShopChargeGeneral implements IShopCharge {
private double money ;
private ShopChargeGeneral(){}
public ShopChargeGeneral(double money){
this.money = money;
}
@Override
public double charge() {
// TODO Auto-generated method stub
return money;
}
}
AShopChargePrivilege: 优惠计费抽象类
package com.bo.decorator;
public abstract class AShopChargePrivilege implements IShopCharge {
private IShopCharge shopCharge;
public final void setShopCharge(IShopCharge shopCharge) {
this.shopCharge = shopCharge;
}
@Override
public double charge(){
return this.shopCharge.charge();
}
}
ShopCharegeReturn :返现优惠实现类:
package com.bo.decorator;
public class ShopCharegeReturn extends AShopChargePrivilege {
private double bCost;
private double rCost;
private ShopCharegeReturn(){}
public ShopCharegeReturn(double bCost,double rCost){
this.bCost = bCost;
this.rCost = rCost;
}
@Override
public double charge() {
// TODO Auto-generated method stub
double _money = super.charge();
return _money-((int)_money/bCost)*rCost;
}
}
ShopChargeDiscount :打折优惠实现类:
package com.bo.decorator;
/**
* 商场打折消费
* @author 波
*
*/
public class ShopChargeDiscount extends AShopChargePrivilege {
private double discountNum ;
public ShopChargeDiscount(double discountNum){
this.discountNum = discountNum;
}
private ShopChargeDiscount(){}
@Override
public double charge() {
// TODO Auto-generated method stub
double _money = super.charge();
return _money*this.discountNum;
}
}
TestMain :测试类
package com.bo.decorator;
public class TestMain {
public static void main(String[] args) {
IShopCharge shopCharge = new ShopChargeGeneral(300);
double money = shopCharge.charge();
System.out.println("常规收费: "+money+"$");
//满一百返十块
AShopChargePrivilege shopChargePrivilege = new ShopCharegeReturn(100,10);
shopChargePrivilege.setShopCharge(shopCharge);
money = shopChargePrivilege.charge();
System.out.println("返现优惠后,收费: "+money+"$");
//打折
AShopChargePrivilege shopChargeDiscount = new ShopChargeDiscount(0.8);
shopChargeDiscount.setShopCharge(shopCharge);
money = shopChargeDiscount.charge();
System.out.println("打折优惠后,收费: "+money+"$");
}
}
输出:
常规收费: 300.0$
返现优惠后,收费: 270.0$
打折优惠后,收费: 240.0$