欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-10-28 13:29:04
装饰者设计模式这里通过一个简单的实例来讲解java设计模式之装饰者设计模式的作用。简单明了!!/*装饰者设计模式: 增强一个类的功能,而且还可以让这些装饰类互相装饰。装饰者设计模式的步骤: 1. 在装饰类的内部维护一个被装饰类的引用。 2. 让装饰者有一个共同的父类或者是父接口。目的是使用多态。装饰者设计模式要让这些装饰类有一个共同的父类,目的是为了让这些装饰类可以构成一个装饰链以达到互相装饰的效果。需求1: 编写一个类拓展BufferReader的功能,拓展一个read...

装饰者设计模式
这里通过一个简单的实例来讲解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();
    }
}

本文地址:https://blog.csdn.net/qq_49529322/article/details/112083769