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

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

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

例如:你有个对象有个功能 是在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. Oracle Enterprise Manager 11g 输入用户名和口令 点击“登录”按键后没反应,也不报错,是什么原因?

    在tnsnames.ora文件中检查设置好像没什么问题,用sqlplus也可以正常操作orcl 问题找到了,其实可简单,https://localhost:1158/em/console/logon/ ...

  2. Trie implementation

    在学习 Aho - Corasick Automation Algorithm 之前,先学习一下,Trie 的实现过程: The name trie comes from its use for re ...

  3. Linux必学的60个命令【转载】

    Linux提供了大量的命令,利用它可以有效地完成大量的工 作,如磁盘操作.文件存  [转载地址]http://blog.chinaunix.net/uid-16728139-id-3154272.ht ...

  4. 13-C语言字符串函数库

    目录: 一.C语言字符串函数库 二.用命令行输入参数 回到顶部 一.C语言字符串函数库 1 #include <string.h> 2 字符串复制 strcpy(参数1,参数2); 参数1 ...

  5. MVC-05 Model(2)

    五.使用Code First数据库迁移 当Entity Framework Code First的数据模型发生异动时,默认会引发一个System.InvalidOpertaionException异常 ...

  6. 国内BI工具/报表工具厂商简介

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  7. struts2 taglib struts标签学习整理中

    项目中经常会用到struts标签,这样可以减少代码量. select用法: <s:select list="#request.sysTypes" name="rul ...

  8. arm中的ldr指令

    label .equ 0x53000000 ldr r0, label : 将0x53000000地址处的值放入r0中 ldr r0, =label : 将0x53000000付值给r0.

  9. [HDU 4666]Hyperspace[最远曼哈顿距离][STL]

    题意: 许多 k 维点, 求这些点之间的最远曼哈顿距离. 并且有 q 次操作, 插入一个点或者删除一个点. 每次操作之后均输出结果. 思路: 用"疑似绝对值"的思想, 维护每种状态 ...

  10. [转载]Android 知识图谱

    from: http://blog.csdn.net/xyz_lmn/article/details/41411355