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.装饰类对象在主类中接受请求,将请求发送给真实的对象(相 ...
随机推荐
- BTC钱包对接流程
BTC钱包对接流程: 部署钱包节点 分析钱包的API 通过JSON-RPC访问钱包API 部署测试 1.部署钱包节点 虚拟币交易平台对接所有的虚拟币之前,都要在自己的服务器上部署一个钱包节点,首先要找 ...
- 安装JDK、Tomcat、Maven’详细步骤
安装JDK 1.首先在官网下载JDK1.8包并解压(随便你装哪个版本) 2.下面开始配置环境变量 此电脑-右键-属性-高级系统配置 点击环境变量 将会看到以下界面 在系统变量下“新建” 变量名(J ...
- NATS_03:NATS发布/订阅机制
概念 发布/订阅(Publish/subscribe 或pub/sub)是一种消息范式,消息的发送者(发布者)不是计划发送其消息给特定的接收者(订阅者).而是发布的消息分为不同的类别,而不需要知道什么 ...
- Excel批量删除换行符_clean函数
http://jingyan.baidu.com/article/e2284b2b489b96e2e6118d30.html CLEAN函数,用于删除文本中不能打印的字符.对从其他应用程序中输入的文本 ...
- aspx <%= %> 绑定变量问题及解决方法
aspx页面,前台页面需要用到后台变量字段的时候我们一般使用 <%= 变量 %>,多数情况下使用正常. 但是有的时候就会遇到变量解析被编码的情况,特别是是在head当中css引用lin ...
- bzoj千题计划148:bzoj1537: [POI2005]Aut- The Bus
http://www.lydsy.com/JudgeOnline/problem.php?id=1537 朴素的转移:dp[i][j]=max(dp[i][j-1],dp[i-1][j])+p[i][ ...
- myeclipse使用小结
1.项目设置编码格式 (1)全局编码设置:编码设置的方法:ToolBar-->Window-->Preferences-->General-->Workspace-->T ...
- C++ Core Guidelines
C++ Core Guidelines September 9, 2015 Editors: Bjarne Stroustrup Herb Sutter This document is a very ...
- 你知道吗?10个精妙的 Java 编码最佳实践
这是一个比Josh Bloch的Effective Java规则更精妙的10条Java编码实践的列表.和Josh Bloch的列表容易学习并且关注日常情况相比,这个列表将包含涉及API/SPI设计中不 ...
- soj2013.Pay Back
2013. Pay Back Constraints Time Limit: 1 secs, Memory Limit: 256 MB Description "Never a borrow ...