java基础47 装饰着模式设计
1、装饰者模式
增强一个类的功能,而且还可以让这些装饰类相互装饰
2、装饰者设计模式的步骤
1.在装饰类的内部维护一个被装饰类的引用
2.让装饰者有一个共同的父类或者父接口
3、实例
package com.dhb.file; import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader; /**
* @author DSHORE / 2018-7-11
*
*/
/*
* 装饰者模式:增强一个类的功能,而且还可以让这些装饰类相互装饰
*
*装饰者设计模式的步骤:
* 1.在装饰类的内部维护一个被装饰类的引用
* 2.让装饰者有一个共同的父类或者父接口
*
* 需求1:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有行号.
* 需求2:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有分号.
* 需求3:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有双引号.
* 需求4:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有行号+分号.
* 需求5:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有分号+双引号.
* 需求6:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有双引号双引号+行号.
* 需求7:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有行号+分号+双引号.
*
* 注:如果要实现需求4到7,用装饰者模式对应的调用下面的三个方法即可
* */ //带双引号
class BufferedQuto3 extends BufferedReader{//2.让装饰者有一个共同的父类或者父接口 BufferedReader
public BufferedQuto3(Reader in) {//new BufferedSemi3()
super(in);
}
@Override
public String readLine() throws IOException {
String line=super.readLine();
if(line==null){
return null;
}
line="\""+line+"\"";
return line;
} }
//带分号
class BufferedSemi3 extends BufferedReader{//2.让装饰者有一个共同的父类或者父接口 BufferedReader
//1.在装饰类的内部维护一个被装饰类的引用 (注:如果想要两个或多个类相互装饰,那么就在对应的类上也写上第一步)
BufferedReader bufferedReader;
public BufferedSemi3(BufferedReader bufferedReader) {//=New BufferedLineNum3()
super(bufferedReader);
this.bufferedReader=bufferedReader;
}
@Override
public String readLine() throws IOException {
String line=bufferedReader.readLine();//super 改成了 bufferedReader,因为需要用到带行号的方法;如果还是用super的话,那么调用的是父类BufferedReader,而父类没有带行号的方法。
if(line==null){
return null;
}
line=line+";";
return line;
}
}
//带行号
class BufferedLineNum3 extends BufferedReader{//2.让装饰者有一个共同的父类或者父接口 BufferedReader
int count=;
public BufferedLineNum3(Reader in) {
super(in);
}
@Override
public String readLine() throws IOException {
String line=super.readLine();
if(line==null){
return null;
}
line=count+" "+line;
count++;
return line;
}
}
//主方法
public class Demo19 {
public static void main(String[] args) throws IOException {
File file=new File("F:\\MyJavaCode\\Demo20.java");
FileReader fr=new FileReader(file);
//BufferedReader br=new BufferedReader(fr);
//带行号的缓冲输字符入流
BufferedLineNum3 bln=new BufferedLineNum3(fr);
//带分号的缓冲输入字符流
BufferedSemi3 bs=new BufferedSemi3(bln);
//带双引号的缓冲输入字符流
BufferedQuto3 bq=new BufferedQuto3(fr);
String line=null;
while((line=bs.readLine())!=null){
System.out.println(line);
}
bs.close();
}
}
运行结果图

附录
释:下面的例子没有用到装饰着模式,如果要实现需求4到7的话,那么需要再写一个专门的类,比较繁杂。或者在主方法里面多些几个while循环。
package com.dhb.file; import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader; /**
* @author DSHORE / 2018-7-11
*
*/
/*
* 需求1:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有行号.
* 需求2:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有分号.
* 需求3:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有双引号.
* 需求4:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有行号+分号.
* 需求5:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有分号+双引号.
* 需求6:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有双引号双引号+行号.
* 需求7:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有行号+分号+双引号.
* */ //带双引号
class BufferedQuto extends BufferedReader{
public BufferedQuto(Reader in) {//new BufferedSemi()
super(in);
}
@Override
public String readLine() throws IOException {
String line=super.readLine();
if(line==null){
return null;
}
line="\""+line+"\"";
return line;
}
}
//带分号
class BufferedSemi extends BufferedReader{ public BufferedSemi(Reader in) {//=New BufferedLineNum()
super(in);
}
@Override
public String readLine() throws IOException {
String line=super.readLine();
if(line==null){
return null;
}
line=line+";";
return line;
}
}
//带行号
class BufferedLineNum extends BufferedReader{
int count=;
public BufferedLineNum(Reader in) {
super(in);
}
@Override
public String readLine() throws IOException {
String line=super.readLine();
if(line==null){
return null;
}
line=count+" "+line;
count++;
return line;
}
}
//主方法
public class Demo20 {
public static void main(String[] args) throws IOException {
File file=new File("F:\\MyJavaCode\\Demo20.java");
FileReader fr=new FileReader(file);
//BufferedReader br=new BufferedReader(fr);
//带行号的缓冲输字符入流
BufferedLineNum bln=new BufferedLineNum(fr);
//带分号的缓冲输入字符流
BufferedSemi bs=new BufferedSemi(fr);
//带双引号的缓冲输入字符流
BufferedQuto bq=new BufferedQuto(fr);
String line=null;
while((line=bq.readLine())!=null){
System.out.println(line);
}
bln.close();
}
}
运行结果图

|
原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnblogs.com/dshore123/p/9295335.html 欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!) |
java基础47 装饰着模式设计的更多相关文章
- Java 设计模式泛谈&装饰者模式和单例模式
设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...
- Java设计模式 - - 单例模式 装饰者模式
Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...
- 黑马程序员:Java基础总结----静态代理模式&动态代理
黑马程序员:Java基础总结 静态代理模式&动态代理 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 静态代理模式 public class Ts { ...
- Java中InputStream装饰器模式的大家族
本文写在po主初学JAVA时,在学习inputStream摸不着头脑,受Java IO-InputStream家族 -装饰者模式一文启发,所以在理清思路时写下本文.因为初学,如有错误,望指正. 因为和 ...
- java设计模式—Decorator装饰者模式
一.装饰者模式 1.定义及作用 该模式以对客户端透明的方式扩展对象的功能. 2.涉及角色 抽象构件角色:定义一个抽象接口,来规范准备附加功能的类. 具体构件角色:将要被附加功能的类,实现抽象 ...
- JavaScript高级---装饰者模式设计
一.设计模式 javascript里面给我们提供了很多种设计模式: 工厂.桥.组合.门面.适配器.装饰者.享元.代理.观察者.命令.责任链 在前面我们实现了工厂模式和桥模式 工厂模式 : 核心:为了生 ...
- java设计模式之 装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...
- Java IO-InputStream家族 -装饰者模式
最近看到一篇文章,初步介绍java.io.InputStream,写的非常通俗易懂,在这里我完全粘贴下来. 来源于 https://mp.weixin.qq.com/s/hDJs6iG_YPww7ye ...
- Java设计模式之装饰者模式
要实现装饰者模式,注意一下几点内容: 1.装饰者类要实现真实类同样的接口 2.装饰者类内有一个真实对象的引用(可以通过装饰者类的构造器传入) 3.装饰类对象在主类中接受请求,将请求发送给真实的对象(相 ...
随机推荐
- 解题:BZOJ 2818 GCD
题面 转化一下题目,即是求$1$到$n$中对于某个素数$pri$使得$gcd(x*pri,y*pri)=pri$的$(x,y)$的数目 这样一来就可以考虑每个质数$pri$对答案的贡献,即为$1$到$ ...
- 解题:USACO12FEB Nearby Cows
题面 比较简单的树形dp(递推?) 设$dp[i][j]$表示距离$i$距离为$j$的点的数目,先预处理$g[i][j]$表示点$i$的子树中距离这个点距离为$j$的点的数目(猫老师讲过,用一个栈维护 ...
- LGP5075【JSOI2012】分零食
. 题解: 令$F$为欢乐度$f(x) = Ox^2 + Sx + U$的生成函数,常数项为$0$: 令$G(x) = \sum_{i=0}^{A} F^i (x) $ $ans = [x^M]G;$ ...
- Docker部署Tomcat实例
1.使用Docker部署Tomcat服务 http://www.open-open.com/lib/view/open1455717671698.html 2.搭建docker私有仓库 http:// ...
- fopen()、fwrite()、fread()函数使用说明与示例
fopen()函数: 1.作用: 在C语言中fopen()函数用于打开指定路径的文件,获取指向该文件的指针. 2.函数原型: FILE * fopen(const char * path,const ...
- IntelliJ IDEA中Java类注释
打开Idea,依次选择File-->Settings-->Editor-->File and CodeTemplates ,右侧tab选项卡点击Includes,选择File Hea ...
- vbs 解析 json jsonp 方法
昨天说了下用 htmlfile 来解析 html,今天依然用他来解析,htmlfile 是一个 COM 版的 BOM 和 DOM,所以解析 html, 执行 js 完全不在话下,今天就继续解析 jso ...
- 20155232 2016-2017-3 《Java程序设计》第7周学习总结
20155232 2016-2017-3 <Java程序设计>第7周学习总结 教材学习内容总结 第十三章 1.Greenwich MeanTime,格林威治时间,简称GMT时间,由观察太阳 ...
- SQL查找数据库中所有没有主键的数据表脚本
--SQL查找数据库中所有没有主键的数据表脚本 --运行脚本后在消息中可能会显示下面现象中的一种:--(1)数据库中所有数据表都有主键(则证明所有数据表都有主键)--(2)当前数据表[数据表名]没有主 ...
- HDU 2571 命运 (入门dp)
题目链接 题意:二维矩阵,左上角为起点,右下角为终点,如果当前格子是(x,y),下一步可以是(x+1,y),(x,y+1)或者(x,y*k) ,其中k>1.问最大路径和. 题解:入门dp,注意负 ...