装饰着模式
2016-04-15 12:50
211 查看
装饰着模式涉及的角色
抽象构建角色:定义一个抽象接口,来规范准备附加功能的类
具体构件角色:将要被附加功能的类,实现抽象构件角色接口
抽象装饰者角色:持有对具体构件角色的引用并定义与抽象角色一致的接口
具体装饰角色:实现抽象装饰者角色,负责为具体构件添加额外的功能。
例如有如下场景,卖饮料,可以是酸梅汤,豆浆等。假如纯豆浆(soya)卖五元,现在有三种配料,鸡蛋,糖,黑豆,都可以组合,可以是鸡蛋+豆浆+黑豆,也可以是豆浆加黑豆,各种组合,假如说每一种做法都要写一个类的话,那得需要写很多,会造成类爆炸。
这时装饰者模式就派上用场,
1)因为所有方法的豆浆都属于饮料,所以我先设计一个被装饰的接口Drink类,后期可以定义卖豆浆,卖酸梅汤
2)SoyaBeanMilk 这是具体的被装饰着对象,属于被装饰着,后面的黑豆糖属于装饰着
3)定义一个黑豆、糖、豆浆的装饰着基类,所有类都继承于它,在里面设定各种方法,此场景下设计describe和cost两个方法
4)定义 EggDecorator,SugarDecorator,BlackBeanDecorator,属于具体的装饰着对象,继承与装饰者基类
5)test类,负责具体的操作
装饰者模式的实现
1)具体类
Drink 被装饰者对象的接口
SoyaBeanMilk.java 具体的被装饰者对象
EggDecorator 具体装饰者对象
SugarDecorator.java 具体装饰者对象
BlackBeanDecorator.java 具体装饰者对象
Decorator.java 装饰者基类
Test.java 测试
2)代码如下
被装饰者装饰的接口
装饰者基类,关联Drink
具体的装饰者对象,黑豆
具体的装饰者对象 鸡蛋
具体的装饰着对象,糖的装饰者对象
测试类
结果
抽象构建角色:定义一个抽象接口,来规范准备附加功能的类
具体构件角色:将要被附加功能的类,实现抽象构件角色接口
抽象装饰者角色:持有对具体构件角色的引用并定义与抽象角色一致的接口
具体装饰角色:实现抽象装饰者角色,负责为具体构件添加额外的功能。
例如有如下场景,卖饮料,可以是酸梅汤,豆浆等。假如纯豆浆(soya)卖五元,现在有三种配料,鸡蛋,糖,黑豆,都可以组合,可以是鸡蛋+豆浆+黑豆,也可以是豆浆加黑豆,各种组合,假如说每一种做法都要写一个类的话,那得需要写很多,会造成类爆炸。
这时装饰者模式就派上用场,
1)因为所有方法的豆浆都属于饮料,所以我先设计一个被装饰的接口Drink类,后期可以定义卖豆浆,卖酸梅汤
2)SoyaBeanMilk 这是具体的被装饰着对象,属于被装饰着,后面的黑豆糖属于装饰着
3)定义一个黑豆、糖、豆浆的装饰着基类,所有类都继承于它,在里面设定各种方法,此场景下设计describe和cost两个方法
4)定义 EggDecorator,SugarDecorator,BlackBeanDecorator,属于具体的装饰着对象,继承与装饰者基类
5)test类,负责具体的操作
装饰者模式的实现
1)具体类
Drink 被装饰者对象的接口
SoyaBeanMilk.java 具体的被装饰者对象
EggDecorator 具体装饰者对象
SugarDecorator.java 具体装饰者对象
BlackBeanDecorator.java 具体装饰者对象
Decorator.java 装饰者基类
Test.java 测试
2)代码如下
被装饰者装饰的接口
public interface Drink_decorator { //饮料的描述信息 public String description(); //计算价格 public float cost(); } //具体的被装饰者对象,豆浆是饮料,需要实现饮料的接口 public class SoyaBeanMilk implements Drink_decorator{ @Override public String description() { // TODO Auto-generated method stub return "纯豆浆"; } @Override public float cost() { // TODO Auto-generated method stub return 5f; } }
装饰者基类,关联Drink
public abstract class Decorator implements Drink_decorator{ private Drink_decorator drink;//要装饰的对象 public Decorator(Drink_decorator drink) { // TODO Auto-generated constructor stub this.drink=drink; } @Override public String description() { // TODO Auto-generated method stub return drink.description(); } @Override public float cost() { // TODO Auto-generated method stub return drink.cost(); } }
具体的装饰者对象,黑豆
public class BlackBeanDecorator extends Decorator{ public BlackBeanDecorator(Drink_decorator drink) { super(drink); // TODO Auto-generated constructor stub } @Override public String description() { // TODO Auto-generated method stub return super.description()+"黑豆"; } @Override public float cost() { // TODO Auto-generated method stub return super.cost()+1f; } }
具体的装饰者对象 鸡蛋
public class EggDecorator extends Decorator{ public EggDecorator(Drink_decorator drink) { super(drink); // TODO Auto-generated constructor stub } @Override public String description() { // TODO Auto-generated method stub return super.description()+"鸡蛋"; } @Override public float cost() { // TODO Auto-generated method stub return super.cost()+2f; } }
具体的装饰着对象,糖的装饰者对象
public class SugarDecorator extends Decorator{ public SugarDecorator(Drink_decorator drink) { super(drink); // TODO Auto-generated constructor stub } @Override public String description() { // TODO Auto-generated method stub return super.description()+"糖"; } @Override public float cost() { // TODO Auto-generated method stub return super.cost()+0.5f; } }
测试类
public class test { public static void main(String[] args) { // TODO Auto-generated method stub //生产一杯豆浆 Drink_decorator soya=new SoyaBeanMilk(); //在豆浆中加鸡蛋 EggDecorator eggsoya=new EggDecorator(soya); //在加了鸡蛋的豆浆中加糖 SugarDecorator sugar=new SugarDecorator(eggsoya); //在加了糖加了鸡蛋的豆浆中假如黑豆 BlackBeanDecorator blackBeanDecorator=new BlackBeanDecorator(sugar); //结账 System.out.println("您点的是:"+blackBeanDecorator.description()); System.out.println("您一共消费了多少钱:"+blackBeanDecorator.cost()+"元"); } }
结果
您点的是:纯豆浆鸡蛋糖黑豆 您一共消费了多少钱:8.5元
相关文章推荐
- 理解java回调机制
- JavaScript使用技巧之处理EL表达式
- OllyDbg 使用笔记 (十二)
- 环信及时通讯的整合SDK
- 二叉树的后序遍历
- c#两种过滤HTML代码
- git的使用
- 结对项目之对PIE的测试程序
- 博客测试
- didMoveToSuperview
- OS实验报告--FCFS算法
- 【软件测试】Lab#2 Selenium
- Android 高级UI设计笔记10:瀑布流控件PinterestLikeAdapterView的使用
- 04. Qt做图像处理经验
- 我对 Linux 又爱又痛的五个原因(转)
- JDK的安装和配置
- 无向图最小生成树(prim算法)
- 时序图示例
- Android编译过程详解(一)
- Tomcat简单介绍(配置)