装饰者模式--“演员”的自我修养

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28606665/article/details/83684724

搞了一个星期的装饰者模式,看的是headFirst设计模式,一开始看不懂,然后又看的博客(博客在这里

略有点体会,所以写下来

提示:下面的这些代码,自己要理解,不要直接放到里面运行,我没拿来运行过,我在notepad写的,是用来测试自己真正理解了咩

装饰者模式动态的将责任附加到对象中去,若扩展功能,装饰者提供了比继承更有弹性的替代方案

我们拿去星巴克点咖啡为例,咖啡有很多种,我们会根据自己个人的喜好,会选择加糖……各种。

首先我们得写一个抽象类,“饮料”的抽象类,让所有品种的咖啡都继承自这个类

public abstract class Beverage{
	String descripetion="unKnow Beverage";
	/*
		这里有两个方法
		一个是getDescription()获取到这个种类饮料的描述
		另一个是cost()花费多少钱
	*/
	public  String getDescription(){
		return descripetion;
	}
	public abstract double cost()
}

ok现在我们开始写配料的抽象类,他也是继承自Beverage,有必要一提的是我们后面使用的配料中的getDescription是我们下面写的这个类的重写。

public abstract class CondimentDecorator extends Beverage{
	@Override
	public abstract String getDescription();
	/*
	我们对getDescription进行重写
	*/
}

下一步我们开始写具体的实例类,写一个浓缩咖啡的类,继承自Beverage

/*
		浓缩咖啡
*/
public class Espresso extends Beverage{
	/*
		构造方法会对description进行重新定义,然后zaiBeverage进行重新的return 
	*/
	
	public Espresso(){
		description="Espresso";
	}
	/*
		这里返回的是一杯浓缩咖啡的价格
	*/
	public double cost(){
		return 2;
	}
	
}

下面我们来写几个装饰类,我这里是写了3个

他们继承自CondimentDecorator

构造方法意思是 谁new 我,我用谁的getDescription和cost方法返回给装饰类的CondimentDecorator的getDescription

public class Mocha extends CondimentDecorator{
	Beverage beverage;
	public Mocha(Beverage beverage) {
		this.beverage=beverage;
	}
	public String getDescription() {
		return beverage.getDescription()+",Mocha";
	}
	public double cost() {
		return.20+beverage.cost();
	}
}
public class Soy extends CondimentDecorator{
	
	Beverage beverage;
	public  Soy(Beverage beverage) {
		this.beverage=beverage;
	}
	@Override
	public String  getDescription() {
		return  beverage.getDescription()+",Soy";
	}
	public double cost() {
		// TODO Auto-generated method stub
		return .10+beverage.cost();
	}
	
}
public class Whip extends CondimentDecorator {
	
	Beverage beverage;
	public Whip(Beverage beverage) {
		// TODO Auto-generated constructor stub
		this.beverage=beverage;
	}
	public String  getDescription() {
		return beverage.getDescription()+",Whip";
	}
	@Override
	public double cost() {
		// TODO Auto-generated method stub
		return .30+beverage.cost();
	}
	
}

下面是main方法

解释一下beveage2这个

先子类再父类,一级一级的return 

public class main {

	public static void main(String[] args) {
		Beverage beverage=new Espresso();
		System.out.println(beverage.getDescription()+"$"+beverage.cost());
		Beverage beverage2=new Espresso();
		beverage2=new Mocha(beverage2);
		beverage2=new Soy(beverage2);
		beverage2=new Whip(beverage2);
		System.out.println(beverage2.getDescription()+"$"+beverage2.cost());
	}

}

猜你喜欢

转载自blog.csdn.net/qq_28606665/article/details/83684724
今日推荐