Java---设计模块(装饰模式)
★ 场景和问题
在不对原有对象类进行修改的基础上,如何给一个或多个已有的类对象提供增强额外的功能?
★ 引例
写一个MyBufferedReader类,使它能够对字符流(如FileReader、InputStreamReader和PipedReader等)进行功能增强:
(1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;
(2)提供一个能够每次读取一行字符的myReadLine()方法。
实现对FileReader的功能加强:
package cn.hncu.pattern.decorator.v1;
import java.io.FileReader;
import java.io.IOException;
public class MyBufferedReader {
private FileReader fr;//封装
private char buf[] = new char[1024];
private int count = 0;// 记录当前缓冲区中的字符个数
private int pos = 0;// 游标,数组下标,当前读取的是数组中的哪个元素
public MyBufferedReader(FileReader fr){
this.fr=fr;
}
public int MyRead() throws IOException{
// 当缓冲区为空时,用fr对象到文件中去读取一组数据到缓冲区中
if(count==0){
count = fr.read(buf);
if(count==-1){
return -1;
}
pos=0;;
}
// 从缓冲区中取一个字符出去
char ch = buf[pos];
pos++;
count--;
//返回那个字符
return ch;
}
public String MyReadLine() throws IOException{
StringBuffer strBuffer = new StringBuffer();
int ch=0;
while(((ch=MyRead())!=-1)){
if(ch=='\r'){
continue;
}
if(ch=='\n'){
return strBuffer.toString();
}
strBuffer.append(ch);
}
if(strBuffer.length()!=0){
return strBuffer.toString();
}
return null;
}
public void MyClose() throws IOException{
fr.close();
}
}
测试类:
package cn.hncu.pattern.decorator;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import cn.hncu.pattern.decorator.v1.MyBufferedReader;
public class TestMyBufferReader {
public static void main(String[] args) throws IOException {
//testMyBufferedReader();//测试自己写的缓存流
testBufferedReader();//看看系统的缓存流读取的是不是和自己读取的相同
}
//测试JavaAPI中的BufferedReader类
private static void testBufferedReader() throws IOException {
FileReader in = new FileReader("chx.txt");
BufferedReader bf = new BufferedReader(in);
int ch=0;
while((ch=bf.read())!=-1){
System.out.print((char)ch);
}
bf.close();
}
//测试自己写的MyBufferedReader类
private static void testMyBufferedReader() throws IOException {
FileReader fr = new FileReader("chx.txt");
MyBufferedReader mbf = new MyBufferedReader(fr);
int ch=0;
while((ch=mbf.MyRead())!=-1){
System.out.print((char)ch);
}
mbf.MyClose();
}
}
文件chx.txt:
写一个MyBufferedReader类,使它能够对字符流
(如FileReader、InputStreamReader和PipedReader等)进行功能增强:
(1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;
(2)提供一个能够每次读取一行字符的myReadLine()方法。
chx!!!
OK.
测试类中testMyBufferedReader()方法的输出结果:
写一个MyBufferedReader类,使它能够对字符流
(如FileReader、InputStreamReader和PipedReader等)进行功能增强:
(1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;
(2)提供一个能够每次读取一行字符的myReadLine()方法。
chx!!!
OK.
测试类中testBufferReader()方法的输出结果:
写一个MyBufferedReader类,使它能够对字符流
(如FileReader、InputStreamReader和PipedReader等)进行功能增强:
(1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;
(2)提供一个能够每次读取一行字符的myReadLine()方法。
chx!!!
OK.
可以看到,输出的结果是一样的!
下面实现对多个类的缓存增强支持:
package cn.hncu.pattern.decorator.v3;
import java.io.IOException;
import java.io.Reader;
public class MyReader extends Reader{
//如果不写继承,就没有融入体系中去,所以要继承Reader类
private Reader r;
private char[] buf = new char[1024];
private int count = 0;// 记录当前缓冲区中的字符个数
private int pos = 0;// 游标,数组下标,当前读取的是数组中的哪个元素
public MyReader(Reader r){
this.r=r;
}
public int MyReader() throws IOException{
// 当缓冲区为空时,用r对象到文件中去读取一组数据到缓冲区中
if(count<=0){
count=0;
}
if(count==0){
count=r.read(buf);
if(count==-1){
return -1;
}
pos=0;
}
// 从缓冲区中取一个字符出去
int ch = buf[pos];
pos++;
count--;
return ch;
}
public String MyReaderLine() throws IOException{
StringBuffer strBuffer = new StringBuffer();
int ch=0;
while((ch=MyReader())!=-1){
if(ch=='\r'){//回车
continue;
}
if(ch=='\n'){//换行
return strBuffer.toString();
}
char s = (char)ch;
strBuffer.append(s);
}
if(strBuffer.length()!=0){
return strBuffer.toString();
}
return null;
}
public void MyClose() throws IOException {
r.close();
}
@Override
public int read(char[] cbuf, int off, int len) throws IOException {
return read(cbuf, off, len);
}
@Override
public void close() throws IOException {
r.close();
}
}
测试类:
package cn.hncu.pattern.decorator;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import cn.hncu.pattern.decorator.v3.MyReader;
public class TestMyReader {
public static void main(String[] args) throws IOException {
testMyReaderLine();//测试自己写的缓存流
System.out.println("-------------");
testMyReader();
}
//测试自己写的MyReader类的MyReader()
private static void testMyReader() throws IOException {
InputStreamReader in = new FileReader("chx.txt");
MyReader mr = new MyReader(in);
int ch=0;
while((ch=mr.MyReader())!=-1){
System.out.print((char)ch);
}
mr.close();
}
//测试自己写的MyReader类的MyReaderLine()
private static void testMyReaderLine() throws IOException {
FileReader fr = new FileReader("chx.txt");
MyReader mbf = new MyReader(fr);
String ch=null;
while((ch=mbf.MyReaderLine())!=null){
System.out.print(ch);
System.out.println();
}
mbf.MyClose();
}
}
文件和上面的文件是一样的,下面看输出结果:
写一个MyBufferedReader类,使它能够对字符流
(如FileReader、InputStreamReader和PipedReader等)进行功能增强:
(1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;
(2)提供一个能够每次读取一行字符的myReadLine()方法。
chx!!!
OK.
-------------
写一个MyBufferedReader类,使它能够对字符流
(如FileReader、InputStreamReader和PipedReader等)进行功能增强:
(1) 提供带缓冲的myRead()方法,对原有的read()方法进行增速;
(2)提供一个能够每次读取一行字符的myReadLine()方法。
chx!!!
OK.
装饰比继承更灵活,避免了继承造成的体系臃肿问题。
Java---设计模块(装饰模式)的更多相关文章
- Java 9 模块解耦的设计策略
1. 概述 Java 平台模块系统 (Java Platform Module System,JPMS)提供了更强的封装.更可靠且更好的关注点分离. 但所有的这些方便的功能都需要付出代价.由于模块化的 ...
- Java 208 道面试题:Java 基础模块答案
目前市面上的面试题存在两大问题:第一,题目太旧好久没有更新了,还都停留在 2010 年之前的状态:第二,近几年 JDK 更新和发布都很快,Java 的用法也变了不少,加上 Java 技术栈也加入了很多 ...
- Swing 是一个为Java设计的GUI工具包
Swing 是一个为Java设计的GUI工具包. Swing是JAVA基础类的一部分. Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表. Swing提供许多比AWT更好的屏幕 ...
- 使用Java设计验证码生成程序
我们来设计一个简单的验证码生成程序:验证码一个由4位的数字.字母随机组合而成图像,为了避免被光学字元识别(OCR,Optical Character Recognition)之类的程序识别出图片中的数 ...
- kettle工具的设计模块
大家都知道,每个ETL工具都用不同的名字来区分不同的组成部分.kettle也不例外. 比如,在 Kettle的四大不同环境工具 本博客,是立足于kettle工具的设计模块的概念介绍. 1.转换 转换( ...
- 哈希表hashTable的Java设计
1:哈希表的概念 2:设计原理 3:哈希表的Java设计
- Java 登录模块设计
登录流程 前端登录传输用户名和md5加密后的密码 后端对密码在进行md5加密,或者使用md5加密的密码 + id 进行盐加密,增加密码被破解的难度. 登录成功后,这里分成单体,或者分布式的情况 单体 ...
- Java-单机版的书店管理系统(练习设计模块和思想_系列汇总)
介绍: 本软件系列到此,我已经全部写完了. 项目练习目标 : 1.Java应用程序基本分析 2.培养面向对象编程的基本思想 3.Java基本设计模式综合应用 4.掌握分层和接口的基本设计 5.构建合理 ...
- MapDB:专为Java设计的高性能的数据库
MapDB是一个快速.易用的嵌入式Java数据库引擎,它提供了基于磁盘或者堆外(off-heap允许Java直接操作内存空间, 类似于C的malloc和free)存储的并发的Maps.Sets.Que ...
- java设计原则:16种原则
一 类的设计原则 1 依赖倒置原则-Dependency Inversion Principle (DIP) 2 里氏替换原则-Liskov Substitution Principle (L ...
随机推荐
- 泛泰A870刷4.4专用英文版非触摸CWM Recovery 6.0.4.8(三版通刷)
首先声明. 发此Recovery的目的是測试能否够三版都能够启动. 而且不会出现像850 860之前出现过的卡第一屏问题! 不希望看到某些人士的过度解读!! 此Recovery能够刷第三方4.4 RO ...
- apache利用.htaccess实现部分页面301
由于网站改版,对访问url进行了改进 原:http://www.tutufu.com/w_weifenlei/DeHaiZi_38251/ 现:http://www.tutufu.com/unclas ...
- EntityFramwork6 在项目中的应用实例
在项目开发中使用的ROM大多采用EntityFramwork去完成,下边给出最新的EntityFramwork在项目中的应用实例 : 一.更新EntityFramwork 在安装.NetFramwor ...
- 【移动开发】WIFI热点通信(一)
之前调查过Android中WIFI模块的使用,也写过两篇学习总结的文章(http://smallwoniu.blog.51cto.com/3911954/1334951),后来发现DEMO里面还是有许 ...
- ckeditor常用设置
1.首先下载ckeditor放入自己的项目WebRoot目录下 2.在自己的页面中引入需要的js库 3.在界面中书写多行文本域 必须要有name或者id属性 不然没有效果显示 4.修改ckedito ...
- Html.RenderPartial和Html.RenderAction的区别
添加一个PartialController控制器 using System; using System.Collections.Generic; using System.Linq; using Sy ...
- POJ1502
#include <iostream> #include <cstdio> #include <algorithm> #include <climits> ...
- hdu 1175
#include <iostream> #include <string> #include <stdio.h> using namespace std; int ...
- hdu 2189
//hdu2189 题意大概就是给n个人,分成多组,要求每组人数都是素数,求有多少种... 解法就是先把150以内的素数全部存入一个数组,然后利用a[j+b[i]]+=a[j];这道题一开始没理解 ...
- 让 IE 支持HTML5 placeholder
HTML5 新增的placeholder属性已经得到现代浏览器的支持,旨在提供简单的API可以为文本输入框设置 描述输入字段预期值的提示信息(hint). 这是W3C在标准化的过程中对用户体验的更多考 ...