设计模式笔记之装饰者模式(Decorator Pattern)

一、概述:

蛋糕店卖蛋糕,有基本的底,如奶油蛋糕,允许客户订制配置,如:加草莓,加巧克力,结账方式:底+配置(装饰)

二、分析:
除了基本的底之外所有的配置,都是装饰者,可以将其抽象出一个接口,蛋糕底也有多样,也可以创建一个借口

三、解决方法:

1.创建蛋糕底接口:

/**
 * 蛋糕底接口
 * @author yu
 *
 */
public interface Cake {
 /**
  * 结账方法
  * @return
  */
 public float cost();
}

2.定义蛋糕底:

/**
 * 蛋糕底,如奶油蛋糕
 * @author yu
 *
 */
public class MilkCake implements Cake {
 private float price = 100f;
 @Override
 public float cost() {
  return price;
 }
}

3.定义蛋糕的装饰者接口:

public abstract class CakeDecorator implements Cake {
 
}

4.定义装饰者:

/**
 * 加了巧克力的蛋糕
 * @author yu
 *
 */
public class ChrolateCake extends CakeDecorator {
 private Cake cake;
 private float price = 10f;   //巧克力的价格
 public ChrolateCake(Cake cake){
  this.cake = cake;
 }
 /**
  * 计算加了巧克力后的价格
  */
 @Override
 public float cost() {
  return cake.cost() + price;
 }
}
5。测试,订制蛋糕,并计算价格:

MilkCake m = new MilkCake(); //选择了奶油蛋糕底
ChrolateCake cc= new ChrolateCake(m); //加了巧克力
System.out.println(cc.cost());
在此模式中除了主题(蛋糕底)之外,所有的配置(樱桃,巧克力等)都是装饰者,实际中可以根据寻求往主题上添加,只要在new装饰者时将最后的实现了Cake接口的类传进去就OK了

四、小结:

装饰者模式在java.io包中使用的最为广泛,典型的一层套一层的做法,原有的输入流不具有某些方法,可以在外面套一层,就可以利用其特殊的方法了,如:

InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);
String s = null;
s = br.readLine();





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值