提出需求
卖早餐煎饼大叔需要我们提供煎饼价格计算服务。例如素煎饼5块,加一个鸡蛋1块,加一根香肠2块。不同的人会有不同的煎饼要求。
需求分析
这个问题我们可以简化为一个煎饼需要被装饰(功能增加),比如加鸡蛋或香肠。那么我们就很容易联想到能不能使用装饰者模式来进行此功能的完成呢?
代码实现
- 1.代码结构
-
2 具体代码
Cake
/**
* @Auther: ming.wang
* @Date: 2019/2/23 13:45
* @Description:
*/
public abstract class Cake {
public abstract String getName();
public abstract long cost();
}
Battercake
public class Battercake extends Cake {
@Override
public String getName() {
return "煎饼";
}
@Override
public long cost() {
return 3;
}
}
AbstractDecorator
/**
* @Auther: ming.wang
* @Date: 2019/2/23 13:48
* @Description: 抽象装饰类
*/
public abstract class AbstractDecorator extends Cake {
private Cake cake;
public AbstractDecorator(Cake cake) {
this.cake = cake;
}
@Override
public String getName() {
return cake.getName();
}
@Override
public long cost() {
return cake.cost();
}
}
EggDecorator
/**
* @Auther: ming.wang
* @Date: 2019/2/23 13:50
* @Description: 具体的装饰类(鸡蛋)
*/
public class EggDecorator extends AbstractDecorator {
public EggDecorator(Cake cake) {
super(cake);
}
@Override
public String getName() {
return super.getName()+" 再加一个鸡蛋";
}
@Override
public long cost() {
return super.cost()+1;
}
}
SuasageDecorator
/**
* @Auther: ming.wang
* @Date: 2019/2/23 13:52
* @Description: 具体的装饰类(香肠)
*/
public class SuasageDecorator extends AbstractDecorator {
public SuasageDecorator(Cake cake) {
super(cake);
}
@Override
public String getName() {
return super.getName()+" 再加一根香肠";
}
@Override
public long cost() {
return super.cost()+2;
}
}
Test
/**
* @Auther: ming.wang
* @Date: 2019/2/23 13:53
* @Description:
*/
public class Test {
public static void main(String[] args) {
Cake cake=new SuasageDecorator(new EggDecorator(new Battercake()));
System.out.println(cake.getName()+ " 总计:"+cake.cost());
}
}
总结
装饰者模式基本套路:牢记四个角色
- 被装饰者的超类,简称超类。本例中为Cake类,饼
- 需要被装饰的具象类,父类为超类,本例中为Battercake煎饼
- 抽象的装饰类,父类为超类,本例中为AbstractDecorator
-
装饰类的具象类,父类为抽象的装饰类,本例中为EggDecorator和SuasageDecorator
看下UML类图可能更清晰点
网友评论