java中装饰者设计模式_Java设计模式之装饰者设计模式

/*

装饰者设计模式: 增强一个类的功能,而且还可以让这些装饰类互相装饰。

装饰者设计模式的步骤:

1. 在装饰类的内部维护一个被装饰类的引用。

2. 让装饰者有一个共同的父类或者是父接口。目的是使用多态。

装饰者设计模式要让这些装饰类有一个共同的父类,目的是为了让这些装饰类

可以构成一个装饰链以达到互相装饰的效果。

需求1: 编写一个类拓展BufferReader的功能,拓展一个readLine方法返回的字符串带有行号。

需求2: 编写一个类拓展BufferReader的功能,拓展一个readLine方法返回的字符串带有分号。

需求3: 编写一个类拓展BufferReader的功能,拓展一个readLine方法返回的字符串带有双引号。

需求4: 编写一个类拓展BufferReader的功能,拓展一个readLine方法返回的字符串带有行号+分号。

需求5: 编写一个类拓展BufferReader的功能,拓展一个readLine方法返回的字符串带有分号+双引号。

需求6: 编写一个类拓展BufferReader的功能,拓展一个readLine方法返回的字符串带有双引号+行号。

需求7: 编写一个类拓展BufferReader的功能,拓展一个readLine方法返回的字符串带有行号+分号+双引号。

继承实现的增强类和装饰者设计模式实现的增强类有何区别?

继承实现的增强类:

优点: 代码结构清晰,而且实现简单。

缺点: 对于每一个需要增强的类都要创建具体的子类来帮助其增强,这样会导致继承体系过于庞大。

装饰者设计模式实现的增强类:

优点: 内部可以通过多态技术对多个需要增强的类进行增强。可以使这些装饰类达到互相装饰的效果。使用比价灵活。

缺点: 需要内部通过多态技术维护需要增强的类的实例,进而使得代码稍微复杂。

*/

import java.io.*;

//带行号的缓冲输入字符流

class BufferedLineNum2 extends BufferedReader{ //为什么要使用继承? 目的是使用多态。然后这些装饰者类的对象可以作为参数进行传递,达到互相装饰的效果。

int count;

//在内部维护一个被装饰类的引用。

BufferedReader bufferedReader;

public BufferedLineNum2(BufferedReader bufferedReader){

//指定调用父类的一个参数的构造方法。注意: 只要的一个参数就行,不一定参数要和父类的一样。

super(bufferedReader); //注意: 该语句没有任何作用,只不过是为了让代码不报错。

this.bufferedReader = bufferedReader;

}

public String readLine() throws IOException{

String line = bufferedReader.readLine();

if (line == null){

return null;

}

line = count + " " + line;

count++;

return line;

}

}

//带分号的缓冲输入字符流

class BufferedSemi2 extends BufferedReader{

//在内部维护一个被装饰类的引用

BufferedReader bufferedReader;

public BufferedSemi2(BufferedReader bufferedReader){ //BufferedReader bufferedReader = new BufferedLineNum(); //多态的用法。

super(bufferedReader);

this.bufferedReader = bufferedReader;

}

public String readLine() throws IOException{

String line = bufferedReader.readLine(); //如果这里的ReadLine方法是调用了BufferedLineNum2的readLine方法,问题马上解决。

if (line == null){

return null;

}

line = line + ";";

return line;

}

}

//带双引号的缓冲输入字符流

class BufferedQuto2 extends BufferedReader{

//在内部维护一个被装饰的类

BufferedReader bufferedReader;

public BufferedQuto2(BufferedReader bufferedReader) {

super(bufferedReader); //只是为了让代码不报错

this.bufferedReader = bufferedReader;

}

public String readLine() throws IOException{

String line = bufferedReader.readLine();

if (line == null){

return null;

}

line = "\"" + line + "\"";

return line;

}

}

public class Demo1 {

public static void main(String[] args) throws IOException{

File file = new File("E:\\IDEA-java语言学习\\装饰者设计模式\\src\\Demo1.java");

FileReader fileReader = new FileReader(file);

//建立缓冲输入字符流

BufferedReader bufferedReader = new BufferedReader(fileReader);

//建立带行号的缓冲输入字符流

BufferedLineNum2 bufferedLineNum2 = new BufferedLineNum2(bufferedReader); //多态的用法。

//建立带分号的缓冲输入字符流

BufferedSemi2 bufferedSemi2 = new BufferedSemi2(bufferedLineNum2);

//建立带双引号的缓冲输入字符流

BufferedQuto2 bufferedQuto2 = new BufferedQuto2(bufferedSemi2);

String line = null;

while ((line = bufferedQuto2.readLine()) != null){

System.out.println(line);

}

bufferedReader.close();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值