装饰者模式说, 只是“将灵活的附加职责动态地附加到对象上”。

换句话说, 装饰器模式使用合成而不是继承来扩展对象在运行时的功能。

装饰器模式也称为包装器。

装饰图案的优势

它提供了比静态继承更大的灵活性。

因为可以通过对新类进行编码来进行更改, 所以可以增强对象的可扩展性。

它允许你从目标类开发一系列功能, 而不是将所有行为编码到对象中, 从而简化了编码。

装饰图案的用法

它用于:

当你想要透明, 动态地向对象添加职责而又不影响其他对象时。

当你想向对象添加职责时, 将来可能需要更改。

通过子类扩展功能不再可行。

用于装饰器模式的UML:

第1步:创建食物界面。

public interface Food {

public String prepareFood();

public double foodPrice();

}// End of the Food interface.

步骤2:创建一个VegFood类, 该类将实现Food接口并覆盖其所有方法。

public class VegFood implements Food {

public String prepareFood(){

return "Veg Food";

}

public double foodPrice(){

return 50.0;

}

}

第3步:创建一个FoodDecorator抽象类, 该类将实现Food接口并覆盖所有方法, 并且可以装饰更多食物。

public abstract class FoodDecorator implements Food{

private Food newFood;

public FoodDecorator(Food newFood){

this.newFood=newFood;

}

@Override

public String prepareFood(){

return newFood.prepareFood();

}

public double foodPrice(){

return newFood.foodPrice();

}

}

步骤4:创建NonVegFood具体类, 该类将扩展FoodDecorator类并覆盖所有方法。

public class NonVegFood extends FoodDecorator{

public NonVegFood(Food newFood) {

super(newFood);

}

public String prepareFood(){

return super.prepareFood() +" With Roasted Chiken and Chiken Curry ";

}

public double foodPrice(){

return super.foodPrice()+150.0;

}

}

第5步:创建一个ChineeseFood具体类, 该类将扩展FoodDecorator类并覆盖所有方法。

public class ChineeseFood extends FoodDecorator{

public ChineeseFood(Food newFood) {

super(newFood);

}

public String prepareFood(){

return super.prepareFood() +" With Fried Rice and Manchurian ";

}

public double foodPrice(){

return super.foodPrice()+65.0;

}

}

步骤6:创建一个DecoratorPatternCustomer类, 该类将使用Food接口来使用客户想要的食物类型(Decorates)。

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

public class DecoratorPatternCustomer {

private static int choice;

public static void main(String args[]) throws NumberFormatException, IOException{

do{

System.out.print("========= Food Menu ============ \n");

System.out.print(" 1. Vegetarian Food. \n");

System.out.print(" 2. Non-Vegetarian Food.\n");

System.out.print(" 3. Chineese Food. \n");

System.out.print(" 4. Exit \n");

System.out.print("Enter your choice: ");

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

choice=Integer.parseInt(br.readLine());

switch (choice) {

case 1:{

VegFood vf=new VegFood();

System.out.println(vf.prepareFood());

System.out.println( vf.foodPrice());

}

break;

case 2:{

Food f1=new NonVegFood((Food) new VegFood());

System.out.println(f1.prepareFood());

System.out.println( f1.foodPrice());

}

break;

case 3:{

Food f2=new ChineeseFood((Food) new VegFood());

System.out.println(f2.prepareFood());

System.out.println( f2.foodPrice());

}

break;

default:{

System.out.println("Other than these no food available");

}

return;

}//end of switch

}while(choice!=4);

}

}

输出量

========= Food Menu ============

1. Vegetarian Food.

2. Non-Vegetarian Food.

3. Chineese Food.

4. Exit

Enter your choice: 1

Veg Food

50.0

========= Food Menu ============

1. Vegetarian Food.

2. Non-Vegetarian Food.

3. Chineese Food.

4. Exit

Enter your choice: 2

Veg Food With Roasted Chiken and Chiken Curry

200.0

========= Food Menu ============

1. Vegetarian Food.

2. Non-Vegetarian Food.

3. Chineese Food.

4. Exit

Enter your choice: 3

Veg Food With Fried Rice and Manchurian

115.0

========= Food Menu ============

1. Vegetarian Food.

2. Non-Vegetarian Food.

3. Chineese Food.

4. Exit

Enter your choice: 4

Other than these no food available

给模型加装饰器Java,装饰器设计模式相关推荐

  1. java 调用scala 类_如何使用java类加载器调用带参数的scala函数?

    我正在寻找一些将scala jar加载到java类加载器的指导. 当我使用java jar文件时,下面的函数对我有效. 其中,arr是一个java.net.URL数组,用于我需要加载到类加载器中的所有 ...

  2. Java 装饰器模式详解

    转载请注明出处:http://blog.csdn.net/zhaoyanjun6/article/details/56488020 前言 在上面的几篇文章中,着重介绍了java 中常见的 IO 相关知 ...

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

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

  4. JAVA开发的23种设计模式之 —  装饰器模式 代理器模式

    装饰器模式 概述 : 动态的给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更加灵活 维基百科解释 : 通过使用修饰模式,可以在运行时扩充一个类的功能.原理是 :增加一个修饰类包裹 ...

  5. Java装饰器模式详解

    前言 装饰器模式也叫做包装器模式,属于结构性设计模式一种,装饰器设计模式在实际的生活中也有很多体现,举例来说,某手机厂商发布了XXX标准版手机,为了吸引用户眼球,提升销量,还特别有纪念碑,青春版,至尊 ...

  6. python两层装饰器_python装饰器

    Python的装饰器的英文名叫Decorator,基本上适用的场景就是"装修":不涉及主流程业务,用于鉴权.审计等副业. 1.函数 在python中,函数通过def关键字.函数名和 ...

  7. python装饰器-python装饰器简介---这一篇也许就够了(推荐)

    Python装饰器(decorator)是在程序开发中经常使用到的功能,合理使用装饰器,能让我们的程序如虎添翼. 装饰器引入 初期及问题诞生 假如现在在一个公司,有A B C三个业务部门,还有S一个基 ...

  8. python装饰器类-PYTHON里的装饰器能装饰类吗

    扩展回答 如何理解python里的装饰器 通常可以理解它是一个hook 的回调函数. 或者是理解成python 留给二次开发的一个内置API. 一般是用回调和hook 方式实现的. 如何理解Pytho ...

  9. python装饰器-python修饰器(装饰器)以及wraps

    Python装饰器(decorator)是在程序开发中经常使用到的功能,合理使用装饰器,能让我们的程序如虎添翼. 装饰器的引入 初期及问题的诞生 假如现在在一个公司,有A B C三个业务部门,还有S一 ...

最新文章

  1. 边缘网联与5G等服务器
  2. python-opencv 轮廓检测
  3. Java反射以及应用
  4. noip2016普及组 魔法阵vijos2012
  5. Spring boot 和Vue开发中CORS跨域问题
  6. 020_Vue非父子组件之间数据交互
  7. poj 1932(spfa判断环)
  8. 融合libevent和protobuf
  9. concurrent map使用
  10. Educational Codeforces Round 47 (Rated for Div. 2) :E. Intercity Travelling
  11. htc one m7 linux驱动,HTC One M7官方RUU固件包(可救砖)
  12. vcenter服务器修改ip,vcenter服务器默认ip地址
  13. BIND 服务器修复多个高危漏洞
  14. UI之CALayer详解(转)
  15. 用ICC编译MP3编码器LAME
  16. 一个故意不通过图灵测试的人工智能
  17. 必须安装三星系列android系统智能手机usb驱动程序,三星安卓4.0怎么刷机 三星安卓4.0刷机教程...
  18. 【操作系统】系统中断技术
  19. 基于Struts2的网上书城(仿当当网)系统
  20. 使用360安全卫士对计算机进行体检,360安全卫士使用教程 电脑体检

热门文章

  1. NSight Compute 用户手册(中)
  2. Activity在有Dialog时按Home键的生命周期
  3. idea中设置指向源代码Scala
  4. Python:模拟登录、点击和执行 JavaScript 语句案例
  5. [JS] [C] [编程题] 用户喜好
  6. Ubuntu 修改本地磁盘名称
  7. Binary XML file line #8: Error inflating class android.support.v7.widget.RecyclerView
  8. android.view.InflateException: Binary XML file line #8: Binary XML file line #8: Error inflating cl
  9. Ubuntu安装MongoDB
  10. 讯飞语音的中的bug用户校验失败