在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());
} }

实验结果:

Java 设计模式—装饰者模式的更多相关文章

  1. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  2. JAVA设计模式--装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰 ...

  3. 从源码角度理解Java设计模式——装饰者模式

    一.饰器者模式介绍 装饰者模式定义:在不改变原有对象的基础上附加功能,相比生成子类更灵活. 适用场景:动态的给一个对象添加或者撤销功能. 优点:可以不改变原有对象的情况下动态扩展功能,可以使扩展的多个 ...

  4. 【设计模式】Java设计模式 - 装饰者模式

    Java设计模式 - 装饰者模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自 ...

  5. JAVA 设计模式 装饰者模式

    用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式. 结构

  6. Java设计模式の装饰者模式

    目录 一.问题引入 二.设计原则 三.用装饰者模式解决问题 四.装饰者模式的特点 五.装饰者模式的定义 六.装饰者模式的实现 七.java.io包内的装饰者模式 一.问题引入 咖啡店的类设计: 一个饮 ...

  7. Java设计模式--装饰器模式到Java IO 流

    装饰器模式 抽象构件角色:给出一个抽象接口,以规范准备接受附加责任的对象. 具体构件角色:定义准备接受附加责任的对象. 抽象装饰角色:持有一个构件对象的实例,并对应一个与抽象构件接口一致的接口. 具体 ...

  8. JAVA设计模式---装饰者模式

    写在前面的话: 该模式动态的将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案.装饰者可以在被装饰者的行为前面与/或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的 ...

  9. 设计模式-装饰者模式(Decorator Pattern)

    本文由@呆代待殆原创,转载请注明出处. 此设计模式遵循的设计原则之一:类应该支持扩展,而拒绝修改(Open-Closed Principle) 装饰者模式简述 装饰者模式通过组合的方式扩展对象的特性, ...

随机推荐

  1. applicationContext.xml配置AOP切面编程

    Computer.java package com.wh.aop2; public class Computer { public void play01(){ System.out.println( ...

  2. JAVA中list,set,map与数组之间的转换详解

    package test; import java.util.*; /** * Created by ming */ public class Test { public static void ma ...

  3. html5——动画案例(时钟)

    1.秒钟转360度需要60s分60步 2.分针转360度需要3600s分60步 3.秒钟转360度需要43200s分60步 <!DOCTYPE html> <html lang=&q ...

  4. [Windows Server 2012] Filezilla安全加固方法

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:FileZ ...

  5. 【译】x86程序员手册17-第6章保护

    Chapter 6 Protection 第六章 保护 6.1 Why Protection? 为什么要保护? The purpose of the protection features of th ...

  6. 微信开发配置JSSDK,注入权限验证,以及invalid signature签名错误解决

    在微信开发中很多功能都要用到微信JSSDK,关于JSSDK的使用,微信官方的文档已经比较详细,一定要仔细去看文档. <script src="https://res.wx.qq.com ...

  7. mysql高可用架构mha之master_ip_failover脚本

    脚本如下:           #!/usr/bin/env perl use strict; use warnings FATAL => 'all'; use Getopt::Long; my ...

  8. /etc目录常用配置文件

    /etc/resolv.conf DNS客户端配置文件,逐渐被网卡配置文件所替代 /etc/hosts 本机DNS解析文件,优先级高于DNS服务器 /etc/hostname CentOS 7 主机名 ...

  9. mysql跟java时间类型转换

    参照这个就行了,这个对应注入类型.===========java注入数据库==========java类型 mysql类型 成功与否date date yesdate time nodate time ...

  10. react 父组件调用子组件方法

    import React from 'react'import '../page1/header.css'import { Table } from 'antd'import Child from ' ...