在Java编程语言中,嵌套了非常多设计模式的思想,比如IO流中的缓冲流就使用到以下要介绍的装饰者设计模式。

演示样例代码:

 * 抽象构件角色:定义一个抽象接口,来规范准备附加功能的类
* @author Admin
*
*/
public interface Drink { //被装饰者的基类
public String description();
public int price();
}

/**
* 详细构件角色:将要被附加功能的类,实现抽象构件角色接口
* @author Admin
*
*/
public class SoyaBeanMilk implements Drink{ //被装饰者的详细类 public String description() {
return "豆浆";
} public int price() {
return 2;
} }
/**
* 抽象装饰者角色:持有对详细构件角色的引用(被装饰者)并实现抽象构件角色一致的接口
* @author Admin
*
*/
public class Decorator implements Drink{ //装饰者的基类
private Drink drink;
public Decorator(Drink drink) {
this.drink = drink;
} public String description() {
return drink.description();
} public int price() {
return drink.price();
}
}

/**
* 详细装饰角色:实现抽象装饰者角色。负责为详细构件加入额外功能.
* @author Admin
*
*/
public class Sugar extends Decorator{ //装饰者详细类
public Sugar(Drink drink) {
super(drink);
}
public String description() {
return super.description()+" 糖";
}
public int price() {
return super.price()+1;
}
} /**
* 详细装饰角色:实现抽象装饰者角色,负责为详细构件加入额外功能.
* @author Admin
*
*/
public class BlackBean extends Decorator{
public BlackBean(Drink drink) {
super(drink);
}
public String description() {
return super.description()+" 黑豆";
}
public int price() {
return super.price()+3;
} }
/**
* 測试类(測试装饰者模式)
* @author Admin
*
*/
public class Test { public static void main(String[] args) {
Drink drink = new SoyaBeanMilk(); //被装饰者(豆浆)
System.out.println(drink.description()+"花费:"+drink.price());
Drink drink1 = new Sugar(drink); //糖是装饰者类。用来装饰豆浆
System.out.println(drink1.description()+"花费:"+drink1.price());
Drink drink2 = new BlackBean(drink); //用黑豆来装饰豆浆
System.out.println(drink2.description()+"花费:"+drink2.price());
Drink drink3 = new BlackBean(drink1); //用黑豆来装饰糖豆浆
System.out.println(drink3.description()+"花费:"+drink3.price());
} }

实验结果:

最新文章

  1. CSS知识总结(四)
  2. MongoDB 创建 Database 和 Collection
  3. 【读书笔记】iOS-GCD-系统提供的dispatch方法
  4. JBPM4入门——5.流程定义的发布、查询、删除
  5. 好用的ssh工具oh-my-zsh / iterm2
  6. 第一个GTK+程序
  7. windows下svn+apache搭建svn服务器
  8. windows进程函数试炼
  9. Qt 发送 https 请求
  10. 发一个自己写的php框架
  11. “有箭头的视图”,即程序的Storyboard Entry Point。
  12. jstring, String, char* 变换函数
  13. 1.0 配置 appium + java的环境
  14. 基于.net core实现项目自动编译、并生成nuget包
  15. Django 框架基础
  16. set nocount on/off的作用,可配合存储过程使用
  17. 项目笔记-SC01
  18. 点分治模板(洛谷P4178 Tree)(树分治,树的重心,容斥原理)
  19. 测试工具之appcrawler的使用
  20. 9.json和jsonpath

热门文章

  1. 【Leetcode】92. Reverse Linked List II && 206. Reverse Linked List
  2. debug时红点消失
  3. MyBatis 配置控制台上显示sql语句(log4j.properties 之三)
  4. 实现div毛玻璃背景
  5. fcc html5 css 练习1
  6. Android 在fragment中实现返回键单击提醒 双击退出
  7. html5——2D转换
  8. html5——盒子模式
  9. 基于证书的MS SQL2005数据库镜像搭建
  10. (转)Hibernate关联映射——对象的三种关系