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 { /** ...
随机推荐
- C#中两个整数相除得到带小数点的结果
有时候需要将两个整数相除,获得带小数点的float类型数.例如一个整数12345,需要变成123.45.常见与串口与硬件通讯,DSP处理浮点型比较麻烦,DSP传递来的温度等数据都以整型的方式传递,串口 ...
- 几个linux 下C/C++集成开发环境推荐
链接地址:http://www.lupaworld.com/article-210675-1.html 摘要: 一.AnjutaAnjuta是一个多语言的IDE,它最大的特色是灵活,同时打开多个文件, ...
- UVa1585 Score
#include <stdio.h> int main(){ int T, O, score; char str[81], *p; scanf("%d" ...
- USACO Section 5.3 Milk Measuring (IDDFS+dp)
迭代加深搜索,从小到大枚举桶数的上限maxd:对每个maxd,枚举每个组合,判断是否能够倒出q:直到得到answer.判断的部分就用dp(完全背包). ------------------------ ...
- 简单十步让你全面理解SQL
很多程序员认为SQL是一头难以驯服的野兽.它是为数不多的声明性语言之一,也因为这样,其展示了完全不同于其他的表现形式.命令式语言. 面向对象语言甚至函数式编程语言(虽然有些人觉得SQL 还是有些类似功 ...
- Java "JSON中无分隔符日期字符串处理"
Json 中日期类型数据处理,服务端传输的日期没有分隔符,一般格式就两种,[20151212121212]即yyyyMMddhhmmss和[121212]hhmmss import java.text ...
- 什么是weblogic?安装步骤详解
weblogic,就是用于java开发的web服务器. tomcat熟悉吧,跟tomcat一个作用,是比tomcat更具优势的web服务器. 安装:(转载) 1.提供安装文件网盘下载:链接处2.安装过 ...
- 2_Cat Years
2 // // ViewController.swift // Cat Years // // Created by ZC on 16/1/6. // Copyright © 2016年 ZC. Al ...
- sql语法复习:增删查改,各种数据库对象创建和函数使用
推荐工具:机子配置较低的话,可以装Gsql这个工具获得sql执行环境(可作为手册查看内置数据类型 函数和存储过程等) --之前数据库的东西接触不多,虽然基本的语法是了解,但不是很熟悉--最近项目一直在 ...
- 打包mysql、tomcat、jdk为一个软件
打包mysql.tomcat.jdk为一个软件 博客分类: 成长中的点滴 . 我们在本地开发web应用的时候,直接在IDE里面就可以完成jdk.容器.数据库的配置和集成. 但是如果当我们把应用程序交 ...