设计模式-装饰模式

个人理解: 装饰模式,是对原有功能上的一种增强。


以下情况使用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$

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值