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.装饰类对象在主类中接受请求,将请求发送给真实的对象(相 ...
随机推荐
- 【bzoj4013】 HNOI2015—实验比较
http://www.lydsy.com/JudgeOnline/problem.php?id=4013 (题目链接) 题意 给出$n$个数的$m$个大小关系,问它们之间可以形成的单调不降的序列有多少 ...
- 丁酉年六月十一ACM模拟赛
似乎该写题解了.今天模拟ACM,10道题(本来还有2道被删了),9道都来自BZOJ,中间我做过2道.那么说,今天Solv.便大大增多了(但还是不如强大的Amphetamine). 题单及一句话题解如下 ...
- cocoaPods安装、更新第三方库
pod install 换成 pod install --verbose --no-repo-update pod update 换成 pod update --verbose --no-repo-u ...
- [转载]hzwer的bzoj题单
counter: 664BZOJ1601 BZOJ1003 BZOJ1002 BZOJ1192 BZOJ1303 BZOJ1270 BZOJ3039 BZOJ1191 BZOJ1059 BZOJ120 ...
- RabbitMQ 运转流程
生产者发送消息 1.生产者连接到 RabbitMQ Broker,建立一个连接(Connection),开启一个信道(Channel) 2.生产者声明一个交换器,并设置相关属性,比如交换机类型.是否持 ...
- 读Bayes' Theorem
Bayes' Theorem定理的原理说明,三个简单的例子来说明用法及一些练习. Bayes' Theorem就是概率问题,论文相对比较好理解,也不必做什么笔记.
- 130. Surrounded Regions(M)
130.Add to List 130. Surrounded Regions Given a 2D board containing 'X' and 'O' (the letter O), capt ...
- openstack虚拟机启动过程源码分析
源码版本:H版 以nova-api为起点开始分析! 一.在nova-api进程中进行处理 根据对nova api的分析,当请求发过来的时候,由相应的Controller进行处理,此处如下: nova/ ...
- C++持有Object-C对象时容易内存泄露
在IOS项目中,可以将C++与Object-C混编,不过必须放在实现文件.mm中. 在.mm中,我们可能创建了一个C++对象A,而它持有一个Object-C对象B作为成员变量.当A对象被释放掉的时候, ...
- python获取url响应
前言 requests发请求时,接口的响应时间,也是我们需要关注的一个点,如果响应时间太长,也是不合理的.如果服务端没及时响应,也不能一直等着,可以设置一个timeout超时的时间 关于request ...