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 装饰着模式设计的更多相关文章

  1. Java 设计模式泛谈&装饰者模式和单例模式

    设计模式(Design Pattern) 1.是一套被反复使用.多人知晓的,经过分类编目 的 代码设计经验总结.使用设计模式是为了可重用代码,让代码更容易维护以及扩展. 2.简单的讲:所谓模式就是得到 ...

  2. Java设计模式 - - 单例模式 装饰者模式

    Java设计模式 单例模式 装饰者模式 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 静态代理模式:https://www.cnblogs.com/StanleyBlogs/p/1 ...

  3. 黑马程序员:Java基础总结----静态代理模式&动态代理

    黑马程序员:Java基础总结 静态代理模式&动态代理   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 静态代理模式 public  class  Ts {   ...

  4. Java中InputStream装饰器模式的大家族

    本文写在po主初学JAVA时,在学习inputStream摸不着头脑,受Java IO-InputStream家族 -装饰者模式一文启发,所以在理清思路时写下本文.因为初学,如有错误,望指正. 因为和 ...

  5. java设计模式—Decorator装饰者模式

    一.装饰者模式 1.定义及作用 该模式以对客户端透明的方式扩展对象的功能. 2.涉及角色      抽象构件角色:定义一个抽象接口,来规范准备附加功能的类. 具体构件角色:将要被附加功能的类,实现抽象 ...

  6. JavaScript高级---装饰者模式设计

    一.设计模式 javascript里面给我们提供了很多种设计模式: 工厂.桥.组合.门面.适配器.装饰者.享元.代理.观察者.命令.责任链 在前面我们实现了工厂模式和桥模式 工厂模式 : 核心:为了生 ...

  7. java设计模式之 装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...

  8. Java IO-InputStream家族 -装饰者模式

    最近看到一篇文章,初步介绍java.io.InputStream,写的非常通俗易懂,在这里我完全粘贴下来. 来源于 https://mp.weixin.qq.com/s/hDJs6iG_YPww7ye ...

  9. Java设计模式之装饰者模式

    要实现装饰者模式,注意一下几点内容: 1.装饰者类要实现真实类同样的接口 2.装饰者类内有一个真实对象的引用(可以通过装饰者类的构造器传入) 3.装饰类对象在主类中接受请求,将请求发送给真实的对象(相 ...

随机推荐

  1. 解题:BZOJ 2818 GCD

    题面 转化一下题目,即是求$1$到$n$中对于某个素数$pri$使得$gcd(x*pri,y*pri)=pri$的$(x,y)$的数目 这样一来就可以考虑每个质数$pri$对答案的贡献,即为$1$到$ ...

  2. 解题:USACO12FEB Nearby Cows

    题面 比较简单的树形dp(递推?) 设$dp[i][j]$表示距离$i$距离为$j$的点的数目,先预处理$g[i][j]$表示点$i$的子树中距离这个点距离为$j$的点的数目(猫老师讲过,用一个栈维护 ...

  3. LGP5075【JSOI2012】分零食

    . 题解: 令$F$为欢乐度$f(x) = Ox^2 + Sx + U$的生成函数,常数项为$0$: 令$G(x) = \sum_{i=0}^{A} F^i (x) $ $ans = [x^M]G;$ ...

  4. Docker部署Tomcat实例

    1.使用Docker部署Tomcat服务 http://www.open-open.com/lib/view/open1455717671698.html 2.搭建docker私有仓库 http:// ...

  5. fopen()、fwrite()、fread()函数使用说明与示例

    fopen()函数: 1.作用: 在C语言中fopen()函数用于打开指定路径的文件,获取指向该文件的指针. 2.函数原型: FILE * fopen(const char * path,const  ...

  6. IntelliJ IDEA中Java类注释

    打开Idea,依次选择File-->Settings-->Editor-->File and CodeTemplates ,右侧tab选项卡点击Includes,选择File Hea ...

  7. vbs 解析 json jsonp 方法

    昨天说了下用 htmlfile 来解析 html,今天依然用他来解析,htmlfile 是一个 COM 版的 BOM 和 DOM,所以解析 html, 执行 js 完全不在话下,今天就继续解析 jso ...

  8. 20155232 2016-2017-3 《Java程序设计》第7周学习总结

    20155232 2016-2017-3 <Java程序设计>第7周学习总结 教材学习内容总结 第十三章 1.Greenwich MeanTime,格林威治时间,简称GMT时间,由观察太阳 ...

  9. SQL查找数据库中所有没有主键的数据表脚本

    --SQL查找数据库中所有没有主键的数据表脚本 --运行脚本后在消息中可能会显示下面现象中的一种:--(1)数据库中所有数据表都有主键(则证明所有数据表都有主键)--(2)当前数据表[数据表名]没有主 ...

  10. HDU 2571 命运 (入门dp)

    题目链接 题意:二维矩阵,左上角为起点,右下角为终点,如果当前格子是(x,y),下一步可以是(x+1,y),(x,y+1)或者(x,y*k) ,其中k>1.问最大路径和. 题解:入门dp,注意负 ...