1、使用说明

(1)装饰者模式可以带来比继承更加灵活的扩展功能,使用更加方法,可以通过组合不同的装饰者对象来获取具有不同行为状态的多样化的结果。装饰者模式比继承更具良好的扩展性,完美的遵循开闭原则,继承是静态的附加责任,装饰者则是动态的附加责任。

(2)装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

2、实例public class HelloWorld {

public static void main(String[] args) {

//点一份炒饭

FastFood food = new FriedRice();

//花费的价格

System.out.println(food.getDesc() + " " + food.cost() + "元");

System.out.println("========");

//点一份加鸡蛋的炒饭

FastFood food1 = new FriedRice();

food1 = new Egg(food1);

//花费的价格

System.out.println(food1.getDesc() + " " + food1.cost() + "元");

System.out.println("========");

//点一份加培根的炒面

FastFood food2 = new FriedNoodles();

food2 = new Bacon(food2);

//花费的价格

System.out.println(food2.getDesc() + " " + food2.cost() + "元");

}

}

// 快餐抽象类

abstract class FastFood {

private float price;

private String desc;

public FastFood() {}

public FastFood(float price, String desc) {

this.price = price;

this.desc = desc;

}

public float getPrice() {

return price;

}

public void setPrice(float price) {

this.price = price;

}

public String getDesc() {

return desc;

}

public void setDesc(String desc) {

this.desc = desc;

}

// 获取价格

public abstract float cost();

}

// 炒饭

class FriedRice extends FastFood {

public FriedRice() {

super(10, "炒饭");

}

@Override

public float cost() {

return getPrice();

}

}

// 炒面

class FriedNoodles extends FastFood {

public FriedNoodles() {

super(12, "炒面");

}

@Override

public float cost() {

return getPrice();

}

}

// 配料

abstract class Garnish extends FastFood {

private FastFood fastFood;

public FastFood getFastFood() {

return fastFood;

}

public void setFastFood(FastFood fastFood) {

this.fastFood = fastFood;

}

public Garnish(FastFood fastFood, float price, String desc) {

super(price, desc);

this.fastFood = fastFood;

}

}

// 鸡蛋配料

class Egg extends Garnish {

public Egg(FastFood fastFood) {

super(fastFood, 1, "鸡蛋");

}

@Override

public float cost() {

return getPrice() + getFastFood().getPrice();

}

@Override

public String getDesc() {

return super.getDesc() + getFastFood().getDesc();

}

}

//培根配料

class Bacon extends Garnish {

public Bacon(FastFood fastFood) {

super(fastFood,2,"培根");

}

@Override

public float cost() {

return getPrice() + getFastFood().getPrice();

}

@Override

public String getDesc() {

return super.getDesc() + getFastFood().getDesc();

}

}

以上java装饰者模式的用法,希望能对大家有所帮助。更多Java学习指路:

java 装饰者_java装饰者模式怎么用?相关推荐

  1. java 装饰器_JAVA装饰器模式

    Java程序员们应该对java.io对不会陌生,因为java.io包采用了装饰器模式. 一.定义: Decorator装饰器,顾名思义,就是动态地给一个对象添加一些额外的职责,就好比为房子进行装修一样 ...

  2. java 装饰者_Java装饰者模式

    Hello,即将要写的这篇文章,是对刚刚学习完的装饰者模式的一个总结啦,也不是什么技术难点,就是巩固一下啦. 一.装饰者模式的定义 装饰者模式动态的将责任附加到对象上.若要扩展功能,装饰者提供了比继承 ...

  3. java 装饰流_java装饰流的使用【转】

    装饰流使用 除了按照流的方向可以把流划分为输入流和输出流两类,按照流读写数据的基本单位把流划分为字节流和字符流两类以外,还可以按照流是否直接连接实际数据源,例如文件.网络.字节数组等,将流又可以划分为 ...

  4. java设计模式建造_Java设计模式——建造模式(Builder Pattern)

    Builder模式常用例子 今天就简单粗暴的介绍一下Builder模式概念和使用. Dialog的创建 AlertDialog dialog = new AlertDialog.Builder(thi ...

  5. java中组合_java中组合模式详解和使用方法

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...

  6. java创建型_Java创建型模式

    Java创建型模式 在软件工程中,创建型模式是处理对象创建的设计模式,试图根据实际情况使用合适的方式创建对象.基本的对象创建方式可能会导致设计上的问题,或增加设计的复杂度.创建型模式通过以某种方式控制 ...

  7. java输出不同颜色_Java设计模式-策略模式、状态模式

    推荐阅读: 一只Tom猫:都是"Redis惹的祸",害我差点挂在美团三面,真是"虚惊一场"! java喵:6大面试技能树:JAVA基础+JVM+算法+数据库+计 ...

  8. java控制灯_Java使用桥接模式实现开关和电灯照明功能详解

    本文实例讲述了Java使用桥接模式实现开关和电灯照明功能.分享给大家供大家参考,具体如下: 一.模式定义 桥接模式,也称桥梁模式,在软件系统中,由于自身的逻辑,具有两个或多个维度的变化,如何应对这种多 ...

  9. java设计模式建造_java设计模式-建造者模式

    建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创造不同的表示. 建造者模式将一个产品的内部表象和产品的生成过程分割开来,建造对象的时候只需要指定需要建造的类型,而不必了解具体的 ...

最新文章

  1. Setup best practices for Agile Scrum in your organization
  2. maven中把依赖的JAR包一起打包(转)
  3. php 下 html5 XHR2 + FormData + File API 上传文件
  4. [保护模式]PAE模式
  5. NLog日志框架使用探究
  6. overflow滚动条属性
  7. python匹配字符串_字符串匹配算法之Kmp算法(Python实现)
  8. 纹理特征描述之灰度差分统计特征(平均值 对比度 熵) 计算和比较两幅纹理图像的灰度差分统计特征 matlab代码实现
  9. 驳熊节和Martin Fowler的Java消亡论!
  10. Sublime + Chrome 本地调试 CSS 选择器
  11. 将C#的Dic转成Lua的Table将C#的List转成Lua的Table
  12. 如何选择VC界面库产品?(二)– DSkinLite界面库介绍
  13. 打算开源一个低代码平台,第四天,包含【工作流,业务流,财务,APQC】。技术栈 React,typescript,java,mysql
  14. 基于 VisualStudio2019 的 ASP.NET 后台环境搭建
  15. 前端POST请求下载文件
  16. 经典小游戏开发思路和算法之拼图(1)
  17. 苹果在中国失掉 iPad 商标
  18. VMware的VMDK转换为HyperV的vhdx
  19. Apache ShenYu ModifyResponse插件使用
  20. 修改ARM开发板IP地址

热门文章

  1. 解决Docker容器时区不一致的问题
  2. 2021年终总结模板.pptx(附下载链接)
  3. 智能推荐系统之数据预处理
  4. 测试开发之软件测试模型
  5. PTA4-11 先序输出叶结点
  6. 桂电计算机实训报告总结,桂林电子科技大学信息科技学院
  7. bigdecimal 科学计数转普通计数_通用计数器的应用价值
  8. 程序员的梗_程序员都背着大书包,里面到底装的什么?程序员们:钱、电脑.....
  9. 面试准备每日五题:C++(八)——重写重载隐藏、vector相关
  10. 集成学习——NGBoost论文研读与原理理解