装饰设计模式就是对已有的对象的功能进行增强

当想要对已有的对象进行功能增强时,
可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。
那么自定义的该类称为装饰类。

装饰类通常会通过构造方法接收被装饰的对象。
并基于被装饰的对象的功能,提供更强的功能。

例如:你有个对象有个功能 是在N年前建立的,如今你觉得功能不够用了 写个类把对象传进来就可以解决问题了 如果这个功能写错了 我就把自己写的功能去掉又不影响以前的功能灵活性相当强的。

装饰模式比继承要灵活。避免了继承体系臃肿。
而且降低了类于类之间的关系。

装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
所以装饰类和被装饰类通常是都属于一个体系中的。

 package com.gh.decorator;
/**
* 具体的装饰者对象:黑豆;
* @author ganhang
*
*/
public class BlackBeanDecorator extends Decorator{ public BlackBeanDecorator(Drink drink) {
super(drink);
}
@Override
public String description() {
return super.description()+"+黑豆";
}
@Override
public int cost() {
return super.cost()+2;
}
}
package com.gh.decorator;
/**
* 装饰者父(基)类
* @author ganhang
*
*/
public abstract class Decorator implements Drink{
private Drink drink;
public Decorator(Drink drink) {
this.drink=drink;
}
@Override
public String description() {
return drink.description();
} @Override
public int cost() {
return drink.cost();
} }
package com.gh.decorator;
/**
* 被装饰者对象的接口
* @author ganhang
*
*/
public interface Drink {
//饮料的介绍
public String description();
//饮料的价格
public int cost();
}
package com.gh.decorator;
/**
* 具体的装饰者:鸡蛋;
* @author ganhang
*
*/
public class EggDecorator extends Decorator{ public EggDecorator(Drink drink) {
super(drink);
}
@Override
public String description() {
return super.description()+"+鸡蛋";
}
@Override
public int cost() {
return super.cost()+3;
}
}
package com.gh.decorator;

/**
* 具体的装饰者对象:纯豆浆;
* @author ganhang
*
*/
public class SoyaBeanMilk implements Drink{ @Override
public String description() {
return "纯豆浆";
} @Override
public int cost() {
return 5;
} }
 package com.gh.decorator;

 /**
* 具体的装饰者对象:糖;
*
* @author ganhang
*
*/
public class SugarDecorator extends Decorator { public SugarDecorator(Drink drink) {
super(drink);
} @Override
public String description() {
return super.description() + "+糖";
} @Override
public int cost() {
return super.cost()+1;
}
}
 package com.gh.decorator;

 public class test {
public static void main(String[] args) {
//生产一杯豆浆
Drink soya=new SoyaBeanMilk();
//豆浆里加鸡蛋
EggDecorator eggsoya=new EggDecorator(soya);
//加了鸡蛋的豆浆里加糖
SugarDecorator sugarEggSoya=new SugarDecorator(eggsoya);
//再加个黑豆。。。
BlackBeanDecorator blackBeanSugarEggSoya=new BlackBeanDecorator(sugarEggSoya);
//输出描述
System.out.println(blackBeanSugarEggSoya.description());
//输出价格
System.out.println("价格是:"+blackBeanSugarEggSoya.cost()); }
}

刚好看了个视频 关于装饰设计模式 觉得挺精辟的就保留了下来

什么是装饰设计模式:

当想要对已有的对象进行功能增强时,
可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。
那么自定义的该类称为装饰类。

装饰类通常会通过构造方法接收被装饰的对象。
并基于被装饰的对象的功能,提供更强的功能。

如一个简单的demo 人吃饭,刚开始人穷只是普通的吃饭后来人生活好了吃饭就不一样了增强了吃饭的功能  虽然例子不是恰当 能说明问题就行

看代码:

  1. //穷的时候吃饭简简单单的吃饭
  2. class Person
  3. {
  4. public void chiFan(){
  5. System.out.println("吃饭");
  6. }
  7. }
  8. //富裕后吃饭 吃饭前来杯酒吃饭后来根烟 但是这中间的过程还是有吃饭
  9. class SuperPerson
  10. {
  11. private Person p;
  12. public SuperPerson(Person p){
  13. this.p=p;
  14. }
  15. public void superChiFan(){
  16. //吃饭前来杯开胃酒增加食量
  17. System.out.println("开胃酒");
  18. p.chiFan();
  19. //吃完饭后来根烟
  20. System.out.println("来根烟");
  21. }
  22. }
  23. public class PersonDemo
  24. {   public static void main(String args[]){
  25. Person p=new Person();
  26. SuperPerson sp= new SuperPerson(p);
  27. sp.superChiFan();
  28. }
  29. }

以上只是简单说明一下,在JAVA IO中用了很多增强 如:FileRead中read()方法 只是一个一个字节去读,为了读得更快在BufferedReader就增强了read()方法而产生了reandLine()一行一行的去读

有人说没必要那么麻烦:你只要拿superPerson继承person 在覆写person的chiFan()方法不就行了?

装饰是构造函数参数传递进行增强

如果为了某个功能而产生子类(继承)那么那个体系是非常臃肿的

java学习之IO装饰设计模式的更多相关文章

  1. java15 IO装饰设计模式

    IO装饰设计模式:(IO中使用了装饰设计模式) 节点流可以直接从源读取数据,处理流就是对节点流的包装,这就是装饰,装饰就是对原有的流的性能的提升.比如买的车,马力不够,就进行装饰,使其马力增大. 装饰 ...

  2. java学习一目了然——IO

    java学习一目了然--IO IO是java学习当中很重要的一部分.IO流实现数据的上传下载,即读写数据,包括输入和输出流,输入流指的是将数据以字符或字节形式从外部媒介比如文件.数据库等读取到内存中所 ...

  3. Java文件与io——装饰者模式

    意图: 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比于生成子类更为灵活.该模式以对客户端透明的方式扩展对象的功能. 适用环境 在不影响其他对象的情况下,以动态.透明的 ...

  4. Java学习之==>IO文件操作体系

    一.概述 在整个 Java.io 中最重要的就是5个类和一个接口.5个类指的是 File.InputStream.OutputStream.Reader.Writer,一个接口指的是Serializa ...

  5. Java学习之IO之File类二

    之前学了File便想把我学习视频的名字改了,因为文件名太长不好看,便试着写了个功能实现 package com.gh.file; import java.io.File; /** * 批量文件命名 * ...

  6. java学习之IO流(学习之旅,一)

    个人在学习IO流的时候看到如下所示java 流类图结构的时候,我的感想是,这么多··处于蒙的状态. Java流类图结构 这么多,没有分类不好学,那我们就慢慢一口一口的吃,这样每天学习一点就好了,其实很 ...

  7. java学习笔记--IO流

    第十二章大纲: I/O input/output 输入/输出 一.创建文件,借助File类来实现 file.createNewFile() : 创建文件 file.exists() : 判断文件是否存 ...

  8. Java学习笔记——单例设计模式Singleton

    单例设计模式:singleton 解决的问题: 确保程序在运行过程中,某个类的实例instance只有一份. 特点: 1 构造函数私有化 2 自己内部声明自己 3 提供一个public方法,负责实例化 ...

  9. java学习之IO文件分割

    package om.gh.homework; import java.io.*; /** * 实现分割文件; * @param file */ public class HomeWork { /** ...

随机推荐

  1. UVa202 Repeating Decimals

    #include <stdio.h>#include <map>using namespace std; int main(){    int a, b, c, q, r, p ...

  2. HDOJ 3415 Max Sum of Max-K-sub-sequence(单调队列)

    因为是circle sequence,可以在序列最后+序列前n项(或前k项);利用前缀和思想,预处理出前i个数的和为sum[i],则i~j的和就为sum[j]-sum[i-1],对于每个j,取最小的s ...

  3. 9.PHP 教程_PHP运算符

    PHP 运算符 在 PHP 中,赋值运算符 = 用于给变量赋值. 在 PHP 中,算术运算符 + 用于把值加在一起. PHP 算术运算符 运算符 名称 描述 实例 结果 x + y 加 x 和 y 的 ...

  4. python列表元组

    python列表元组 索引 切片 追加 删除 长度 循环 包含   定义一个列表 my_list = []     my_list = list()   my_list = ['Michael', ' ...

  5. verilog中always块延时总结

    在上一篇博文中 verilog中连续性赋值中的延时中对assign的延时做了讨论,现在对always块中的延时做一个讨论. 观测下面的程序,@0时刻,输入的数据分别是0x13,0x14 . @2时刻, ...

  6. php命名空间及和autoload结合使用问题。

    在讨论如何使用命名空间之前,必须了解 PHP 是如何知道要使用哪一个命名空间中的元素的.可以将 PHP 命名空间与文件系统作一个简单的类比.在文件系统中访问一个文件有三种方式: 相对文件名形式如foo ...

  7. CSS3阴影 box-shadow的使用和技巧总结[转]

    text-shadow是给文本添加阴影效果,box-shadow是给元素块添加周边阴影效果.随着html5和CSS3的普及,这一特殊效果使用越来越普遍. 基本语法是{box-shadow:[inset ...

  8. Dating with girls(1)(二分+map+set)

    Dating with girls(1) Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  9. MySQL几种方法的数据库备份

    MySQL有几个方法来备份 最近博客一直想写点.可是不知道写什么,感觉自己近期的知识没有什么添加,今天想到了一篇能够写的博客.曾经试过依据data目录备份MySQL.可是从来没有成功过.前几天帮助朋友 ...

  10. View从Action中获得数据和html helper function(转载)

    @model MvcApplication1.Models.M_Person @using MvcApplication1.Models; @{ ViewBag.Title = "GetDa ...