版权声明:本文为博主原创文章,未经博主允许不得转载。 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());
}
}