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

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

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

例如:你有个对象有个功能 是在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. 180行ruby代码搞定游戏2048

    最今在玩2048这款小游戏,游戏逻辑简单,很适合我这样的对于游戏新入行的人来实现逻辑.于是选择了最拿手的ruby语言来实现这款小游戏的主要逻辑.还是挺简单的,加起来4小时左右搞定. 上代码: requ ...

  2. Javascript数组的声明

    var cars=new Array(); cars[0]="Audi"; cars[1]="BMW"; cars[2]="Volvo"; ...

  3. 对Devexpress ASP.NET组件的一些看法

    使用.net开发的应该都熟悉DevExpress这套组件,强大的功能,显著提高开发效率和提升用户体验. 不过好像大都用winform, 说起用asp.net组件来开发webform,很多人开口就说慢, ...

  4. zoj 1109 zoj 1109 Language of FatMouse(字典树)

    好开心,手动自己按照字典树的思想用c写了一个优化后的trie字典树,就是用链表来代替26个大小的字符数组.完全按照自己按照自己的想法打的,没有参考如何被人的代码.调试了一天,居然最后错在一个小问题上, ...

  5. POJ 2689 Prime Distance(素数筛选)

    题目链接:http://poj.org/problem?id=2689 题意:给出一个区间[L, R],找出区间内相连的,距离最近和距离最远的两个素数对.其中(1<=L<R<=2,1 ...

  6. Hadoop学习笔记(2)hadoop框架解析

    Hadoop是适合大数据的分布式存储与计算平台 HDFS的架构:主从式结构 主节点只有一个NameNode,从节点可以有很多个DataNode. NameNode负责: (1)接收用户操作请求 (2) ...

  7. [LeetCode]题解(python):085-Maximal Rectangle

    题目来源: https://leetcode.com/problems/maximal-rectangle/ 题意分析: 给定一个二维的二进制矩阵,也就是只包括0 和 1的,找出只包括1的最大的矩阵的 ...

  8. feof()和EOF的用法(转载)

    查看 stdio.h 可以看到如下定义: #define  EOF  (-1) #define  _IOEOF  0x0010 #define  feof(_stream)  ((_stream)-& ...

  9. 8,SSO,,eager copy,COW

    针对字符串不同的长度,“编译器”选择不同的优化策略:SSO, eager copy,COW,分别针对短字符串,中等长度字符串,长字符串.不过,现在(2016)的大多数编译器(gcc 4.9.1,vs2 ...

  10. 转:PAT练习题概览

    AT(pat.zju.edu.cn)是一个面向 C/C++程序的 Online Judge 系统.相比 ZOJ,HDOJ,POJ 等 ACM 题库,PAT 的题目非常基础,对于数据结构.算法的入门是比 ...