设计模式--装饰者模式

一.定义,及设计要点

                 定义:装饰者设计模式是给被装饰者对象动态添加新功能,类似的java IO 的设计也是装饰者模式的应用,它使程序更加灵活易扩展。

                 设计要点:装饰者和被装饰者共同继承同一个父类,继承的目的在于继承类型,而不是行为,装饰者类拥有一个该父类的对象,所以具体的装饰者类中就可以包装另一个

装饰者或者被装饰者,这样就可以对被装饰者的功能进行额外的增强,具体的看下面的例子会比较清晰。

               

二. 举例


          说明:下面举一个买手抓饼算价格的例子,买手抓饼加鸡蛋,加火腿动态的算价格;

Grab.java    共同父类对象,是一个抽象方法

package com.yaspeed.java.decorator;

//定义被装饰对象:手抓饼
public abstract class Grab {
	private String name;
	private float price;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public float getPrice() {
		return price;
	}
	public void setPrice(float price) {
		this.price = price;
	}
	
	public abstract float cost();
	
}

HandGrab.java   具体手抓饼

package com.yaspeed.java.decorator;

public class HandGrab extends Grab{
	
	public HandGrab(){
		super.setName("手抓饼");
		super.setPrice(3.0f);
	}

	@Override
	public float cost() {
		// TODO Auto-generated method stub
		return super.getPrice();
	}

}

装饰者对象

package com.yaspeed.java.decorator;

//定义装饰者
public class Decorator extends Grab{

	private Grab grab;
	
	public Decorator(Grab grab){
		this.grab = grab;
	}
	@Override
	public float cost() {
		//具体装饰者价格+被装饰者费用,形成了递归调用累加所有费用
		return super.getPrice()+grab.cost();
	}
	/* (non-Javadoc)
	 * @see com.yaspeed.java.decorator.Grab#getName()
	 */
	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return grab.getName();
	}
	
	

}

下面为两个具体装饰者:鸡蛋,火腿

package com.yaspeed.java.decorator;

public class Egg extends Decorator{

	public Egg(Grab grab) {
		super(grab);
		super.setName("鸡蛋");
		super.setPrice(1.5f);
	}

	/* (non-Javadoc)
	 * @see com.yaspeed.java.decorator.Grab#getName()
	 */
	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return super.getName()+"  加鸡蛋";
	}
	
	

}

package com.yaspeed.java.decorator;

public class Banger extends Decorator{

	public Banger(Grab grab) {
		super(grab);
		super.setName("火腿");
		super.setPrice(2.0f);
	}
	
	/* (non-Javadoc)
	 * @see com.yaspeed.java.decorator.Grab#getName()
	 */
	@Override
	public String getName() {
		// TODO Auto-generated method stub
		return super.getName()+"  加火腿";
	}
	

}


测试:

package com.yaspeed.java.decorator;

public class Main {
	public static void main(String[] args) {
		
		HandGrab handGrab = new HandGrab();
		System.out.println(handGrab.getName()+"费用:"+handGrab.cost());
		Egg egg = new Egg(handGrab);
		System.out.println(egg.getName()+"费用:"+egg.cost());
		Banger banger = new Banger(egg);
		System.out.println(banger.getName()+"费用:"+banger.cost());
	}
}

结果:

手抓饼费用:3.0
手抓饼  加鸡蛋费用:4.5
手抓饼  加鸡蛋  加火腿费用:6.5









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值