装饰模式

8 篇文章 0 订阅
4 篇文章 0 订阅

有抽象类名为早餐,现在具体的食物只需继承早餐抽象类,就可以作为早餐。

具体构件类,如只有breakfast抽象类和Hamburger类,满足需求。
如果需求改变,hamburger需要加料,又不能或不想改变Hamburger类,那么需要用装饰者模式,添加抽象装饰类和具体装饰类。

早餐类:

public abstract class Breakfast {
	public String description = "undefined";
	public String getDescription() {
		return description;
	}
	
	public abstract double cost();
}

汉堡类:

public class Hamburger extends Breakfast{

	public Hamburger() {
		description = "Hamburger";
	}
	
	@Override
	public double cost() {
		return 15;
	}

}

抽象装饰类:

public abstract class CondimentDecorator extends Breakfast{
	Breakfast myfood;
	
	public CondimentDecorator(Breakfast f) {
		this.myfood = f;
	}
	
	public String getDescription() {
		//return super.getDescription();//多态中父类引用指向子类对象,调用某方法时看子类有无重写,有重写可调用。
		return myfood.getDescription();//返回子类中重写的getDescription方法
	}
	
	public double cost() {
		return myfood.cost();//调用子类中重写的cost方法
	}
	
}

具体装饰类:


/**
 * 具体装饰类,继承抽象装饰类,重写方法
 * 需要扩展一个类的功能或给一个类添加附加职责,动态给一个对象添加功能,这些功能能动态撤销
 * @author Administrator
 *
 */
//加火腿
public class Ham extends CondimentDecorator{

	public Ham(Breakfast f) {
		super(f);//父类的构造函数
	}
	
	public double cost() {
		return super.cost() + 5;//
	}
	
	public String getDescription() {
		return super.getDescription() + ",火腿 ";
	}

}

测试

	
	public static void main(String[] args) {
		Breakfast hamburger = new Hamburger();//点了一个汉堡
		System.out.println(hamburger.getDescription() + " " + hamburger.cost());
		
		//加料
		Breakfast hamplus = new Ham(hamburger);
		System.out.println(hamplus.getDescription() + " " + hamplus.cost());
	}

 

结果:

Hamburger 15.0
Hamburger,火腿  20.0
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值