java学习之IO装饰设计模式
装饰设计模式就是对已有的对象的功能进行增强
当想要对已有的对象进行功能增强时,
可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。
那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接收被装饰的对象。
并基于被装饰的对象的功能,提供更强的功能。
例如:你有个对象有个功能 是在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 人吃饭,刚开始人穷只是普通的吃饭后来人生活好了吃饭就不一样了增强了吃饭的功能 虽然例子不是恰当 能说明问题就行
看代码:
- //穷的时候吃饭简简单单的吃饭
- class Person
- {
- public void chiFan(){
- System.out.println("吃饭");
- }
- }
- //富裕后吃饭 吃饭前来杯酒吃饭后来根烟 但是这中间的过程还是有吃饭
- class SuperPerson
- {
- private Person p;
- public SuperPerson(Person p){
- this.p=p;
- }
- public void superChiFan(){
- //吃饭前来杯开胃酒增加食量
- System.out.println("开胃酒");
- p.chiFan();
- //吃完饭后来根烟
- System.out.println("来根烟");
- }
- }
- public class PersonDemo
- { public static void main(String args[]){
- Person p=new Person();
- SuperPerson sp= new SuperPerson(p);
- sp.superChiFan();
- }
- }
以上只是简单说明一下,在JAVA IO中用了很多增强 如:FileRead中read()方法 只是一个一个字节去读,为了读得更快在BufferedReader就增强了read()方法而产生了reandLine()一行一行的去读
有人说没必要那么麻烦:你只要拿superPerson继承person 在覆写person的chiFan()方法不就行了?
装饰是构造函数参数传递进行增强
如果为了某个功能而产生子类(继承)那么那个体系是非常臃肿的
java学习之IO装饰设计模式的更多相关文章
- java15 IO装饰设计模式
IO装饰设计模式:(IO中使用了装饰设计模式) 节点流可以直接从源读取数据,处理流就是对节点流的包装,这就是装饰,装饰就是对原有的流的性能的提升.比如买的车,马力不够,就进行装饰,使其马力增大. 装饰 ...
- java学习一目了然——IO
java学习一目了然--IO IO是java学习当中很重要的一部分.IO流实现数据的上传下载,即读写数据,包括输入和输出流,输入流指的是将数据以字符或字节形式从外部媒介比如文件.数据库等读取到内存中所 ...
- Java文件与io——装饰者模式
意图: 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比于生成子类更为灵活.该模式以对客户端透明的方式扩展对象的功能. 适用环境 在不影响其他对象的情况下,以动态.透明的 ...
- Java学习之==>IO文件操作体系
一.概述 在整个 Java.io 中最重要的就是5个类和一个接口.5个类指的是 File.InputStream.OutputStream.Reader.Writer,一个接口指的是Serializa ...
- Java学习之IO之File类二
之前学了File便想把我学习视频的名字改了,因为文件名太长不好看,便试着写了个功能实现 package com.gh.file; import java.io.File; /** * 批量文件命名 * ...
- java学习之IO流(学习之旅,一)
个人在学习IO流的时候看到如下所示java 流类图结构的时候,我的感想是,这么多··处于蒙的状态. Java流类图结构 这么多,没有分类不好学,那我们就慢慢一口一口的吃,这样每天学习一点就好了,其实很 ...
- java学习笔记--IO流
第十二章大纲: I/O input/output 输入/输出 一.创建文件,借助File类来实现 file.createNewFile() : 创建文件 file.exists() : 判断文件是否存 ...
- Java学习笔记——单例设计模式Singleton
单例设计模式:singleton 解决的问题: 确保程序在运行过程中,某个类的实例instance只有一份. 特点: 1 构造函数私有化 2 自己内部声明自己 3 提供一个public方法,负责实例化 ...
- java学习之IO文件分割
package om.gh.homework; import java.io.*; /** * 实现分割文件; * @param file */ public class HomeWork { /** ...
随机推荐
- 使用Notepad++快速有效删除复制代码中的行号
转载:http://plum.0602.blog.163.com/blog/static/1130006502011101524120757/ 试了该方法,很好用! 为什么我把用Notepad++删除 ...
- Sql Server 2008/2005 数据库还原出现 3154错误
在Sql Server 2008/2005 数据库还原出现 3154错误 解决方法1:不要在数据库名字上点右键选择还原,而要是在根目录“数据库”三个字上点右键选择还原,然后再选择数据库,问题便可以解决 ...
- malloc/free和new/delete的区别汇总
一.基本概念 malloc/free 1.函数原型及说明: void* malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返回 ...
- BZOJ 1207: [HNOI2004]打鼹鼠( dp )
dp.. dp[ i ] = max( dp[ j ] + 1 ) ------------------------------------------------------------------ ...
- Spring学习之注入方式
我们知道,Spring对象属性的注入方式有两种:设值注入和构造注入. 假设有个类为People,该对象包含三个属性,name和school还有age,这些属性都有各自的setter和getter方法, ...
- Bandwidthd+Postgresql数据库配置笔记
Bandwidthd+Postgresql数据库配置笔记 本系列文章由ex_net(张建波)编写,转载请注明出处. http://blog.csdn.net/zjianbo/article/detai ...
- Arduino 时钟模块(clock module) DS1306
http://www.pjrc.com/teensy/td_libs_DS1307RTC.html 下载相关的库程序 连接: DS1306: 1.接3.3V 2.SDA接A4 3.SCL接A5 读取: ...
- Qt实战之开发软件数据获取助手(eventFilter处理鼠标按下,event处理鼠标松开)
前段时间,受朋友委托,需要做一个能够获取别人软件文本框中内容的助手.当然这需要调用win api来解决问题.一开始,我想都没想,就用getWindowText()....居然没用,好郁闷.于是查msd ...
- 应用 Valgrind 发现 Linux 程序的内存问题
如何定位应用程序开发中的内存问题,一直是 inux 应用程序开发中的瓶颈所在.有一款非常优秀的 linux 下开源的内存问题检测工具:valgrind,能够极大的帮助你解决上述问题.掌握 valgri ...
- linux-0.11抠代码-GDB+VMWARE
vmware新建一个虚拟机,硬盘为0.1G,建立完成后要先启动一次虚拟机,此时无任何系统,然后再关闭,应该会多出一个ostest-flat.vmdk这个虚拟磁盘文件,下面要用到 新建完成后 我的虚拟机 ...