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. HDU.5692 Snacks ( DFS序 线段树维护最大值 )

    HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...

  2. Android Studio之BuildConfig类

    https://blog.csdn.net/lvxiangan/article/details/71601451 Android Studio开发中,把一个module输出打包为jar文件,我们会发现 ...

  3. OpenJudge1001Exponentiation

    问题描述 Problems involving the computation of exact values of very large magnitude and precision are co ...

  4. Docker Secrets

    一.简介 在微服务架构应用中,众多组件在集群中动态地创建.伸缩.更新.在如此动态和大规模的分布式系统上,管理和分发密码.证书等敏感信息将会是非常具有挑战性的工作.对于容器应用,传统的秘密分发方式,如将 ...

  5. ubunto 16.04 lts 源

    http://601502546.blog.163.com/blog/static/2596107620171502517889 国内有很多ubuntu的源,包括:网易源(这个之前用过,速度很快的), ...

  6. Java基础-IO流对象之数据流(DataOutputStream与DataInputStream)

    Java基础-IO流对象之数据流(DataOutputStream与DataInputStream) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.数据流特点 操作基本数据类型 ...

  7. .Net Framework4.0 ashx页面报错:检测到有潜在危险的Request.Form值

    前些日子做项目的时候遇到一个问题,在ASP.NET 中使用JQuery的AJAX调用一般处理程序ashx出错,在处理程序中错误提示如下:从客户端(Text="<img alt=&quo ...

  8. UIScrollView增加回弹效果

    项目中经常要增加上下滑动回弹的效果: self.scrollView.alwaysBounceVertical = YES;

  9. gson转换对象为json字符串时对特殊字符编码的问题

    使用google的gson进行object和json的转换,如下: public static String object2json(Object obj) { Gson gson = new Gso ...

  10. java 编码问题

    Java默认使用Unioncode编码,即不论什么语言都是一个字符占两个字节 Java的class文件编码为UTF-8,而虚拟机JVM编码为UTF-16 UTF-8编码下,一个中文占3个字节,一个英文 ...