• java基础47 装饰着模式设计


    1、装饰者模式

        增强一个类的功能,而且还可以让这些装饰类相互装饰

    2、装饰者设计模式的步骤

        1.在装饰类的内部维护一个被装饰类的引用
        2.让装饰者有一个共同的父类或者父接口

    3、实例

      1 package com.dhb.file;
      2 
      3 import java.io.BufferedReader;
      4 import java.io.File;
      5 import java.io.FileReader;
      6 import java.io.IOException;
      7 import java.io.Reader;
      8 
      9 /**
     10  * @author DSHORE / 2018-7-11
     11  *
     12  */
     13 /*
     14  * 装饰者模式:增强一个类的功能,而且还可以让这些装饰类相互装饰
     15  *
     16  *装饰者设计模式的步骤:
     17  * 1.在装饰类的内部维护一个被装饰类的引用
     18  * 2.让装饰者有一个共同的父类或者父接口
     19  *
     20  * 需求1:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有行号.
     21  * 需求2:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有分号.
     22  * 需求3:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有双引号.
     23  * 需求4:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有行号+分号.
     24  * 需求5:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有分号+双引号.
     25  * 需求6:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有双引号双引号+行号.
     26  * 需求7:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有行号+分号+双引号.
     27  *
     28  * 注:如果要实现需求4到7,用装饰者模式对应的调用下面的三个方法即可
     29  * */
     30 
     31 //带双引号
     32 class BufferedQuto3 extends BufferedReader{//2.让装饰者有一个共同的父类或者父接口   BufferedReader
     33     public BufferedQuto3(Reader in) {//new BufferedSemi3()
     34         super(in);
     35     }
     36     @Override
     37     public String readLine() throws IOException {
     38         String line=super.readLine();
     39         if(line==null){
     40             return null;
     41         }
     42         line="""+line+""";
     43         return line;
     44     }
     45     
     46 }
     47 //带分号
     48 class BufferedSemi3 extends BufferedReader{//2.让装饰者有一个共同的父类或者父接口   BufferedReader
     49     //1.在装饰类的内部维护一个被装饰类的引用  (注:如果想要两个或多个类相互装饰,那么就在对应的类上也写上第一步)
     50     BufferedReader bufferedReader;
     51     public BufferedSemi3(BufferedReader bufferedReader) {//=New BufferedLineNum3()
     52         super(bufferedReader);
     53         this.bufferedReader=bufferedReader;
     54     }
     55     @Override
     56     public String readLine() throws IOException {
     57         String line=bufferedReader.readLine();//super 改成了 bufferedReader,因为需要用到带行号的方法;如果还是用super的话,那么调用的是父类BufferedReader,而父类没有带行号的方法。
     58         if(line==null){
     59             return null;
     60         }
     61         line=line+";";
     62         return line;
     63     }
     64 }
     65 //带行号
     66 class BufferedLineNum3 extends BufferedReader{//2.让装饰者有一个共同的父类或者父接口   BufferedReader
     67     int count=1;
     68     public BufferedLineNum3(Reader in) {
     69         super(in);
     70     }
     71     @Override
     72     public String readLine() throws IOException {
     73         String line=super.readLine();
     74         if(line==null){
     75             return null;
     76         }
     77         line=count+" "+line;
     78         count++;
     79         return line;
     80     }
     81 }
     82 //主方法
     83 public class Demo19 {
     84     public static void main(String[] args) throws IOException {
     85         File file=new File("F:\MyJavaCode\Demo20.java");
     86         FileReader fr=new FileReader(file);
     87         //BufferedReader br=new BufferedReader(fr);
     88         //带行号的缓冲输字符入流
     89         BufferedLineNum3 bln=new BufferedLineNum3(fr);
     90         //带分号的缓冲输入字符流
     91         BufferedSemi3 bs=new BufferedSemi3(bln);
     92         //带双引号的缓冲输入字符流
     93         BufferedQuto3 bq=new BufferedQuto3(fr);
     94         String line=null;
     95         while((line=bs.readLine())!=null){
     96             System.out.println(line);
     97         }
     98         bs.close();
     99     }
    100 }

    运行结果图

    附录

    释:下面的例子没有用到装饰着模式,如果要实现需求4到7的话,那么需要再写一个专门的类,比较繁杂。或者在主方法里面多些几个while循环。

     1 package com.dhb.file;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.File;
     5 import java.io.FileReader;
     6 import java.io.IOException;
     7 import java.io.Reader;
     8 
     9 /**
    10  * @author DSHORE / 2018-7-11
    11  *
    12  */
    13 /*
    14  * 需求1:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有行号.
    15  * 需求2:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有分号.
    16  * 需求3:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有双引号.
    17  * 需求4:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有行号+分号.
    18  * 需求5:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有分号+双引号.
    19  * 需求6:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有双引号双引号+行号.
    20  * 需求7:编写一个类拓展BufferedRead的功能,增强readLine方法返回字符串带有行号+分号+双引号.
    21  * */
    22 
    23 //带双引号
    24 class BufferedQuto extends BufferedReader{
    25     public BufferedQuto(Reader in) {//new BufferedSemi()
    26         super(in);
    27     }
    28     @Override
    29     public String readLine() throws IOException {
    30         String line=super.readLine();
    31         if(line==null){
    32             return null;
    33         }
    34         line="""+line+""";
    35         return line;
    36     }
    37 }
    38 //带分号
    39 class BufferedSemi extends BufferedReader{
    40 
    41     public BufferedSemi(Reader in) {//=New BufferedLineNum()
    42         super(in);
    43     }
    44     @Override
    45     public String readLine() throws IOException {
    46         String line=super.readLine();
    47         if(line==null){
    48             return null;
    49         }
    50         line=line+";";
    51         return line;
    52     }
    53 }
    54 //带行号
    55 class BufferedLineNum extends BufferedReader{
    56     int count=1;
    57     public BufferedLineNum(Reader in) {
    58         super(in);
    59     }
    60     @Override
    61     public String readLine() throws IOException {
    62         String line=super.readLine();
    63         if(line==null){
    64             return null;
    65         }
    66         line=count+" "+line;
    67         count++;
    68         return line;
    69     }
    70 }
    71 //主方法
    72 public class Demo20 {
    73     public static void main(String[] args) throws IOException {
    74         File file=new File("F:\MyJavaCode\Demo20.java");
    75         FileReader fr=new FileReader(file);
    76         //BufferedReader br=new BufferedReader(fr);
    77         //带行号的缓冲输字符入流
    78         BufferedLineNum bln=new BufferedLineNum(fr);
    79         //带分号的缓冲输入字符流
    80         BufferedSemi bs=new BufferedSemi(fr);
    81         //带双引号的缓冲输入字符流
    82         BufferedQuto bq=new BufferedQuto(fr);
    83         String line=null;
    84         while((line=bq.readLine())!=null){
    85             System.out.println(line);
    86         }
    87         bln.close();
    88     }
    89 }

    运行结果图

    原创作者:DSHORE

    作者主页:http://www.cnblogs.com/dshore123/

    原文出自:https://www.cnblogs.com/dshore123/p/9295335.html

    欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

  • 相关阅读:
    Redis的四种模式,单机、主从、哨兵、集群
    .NET 跨域问题
    C# 利用正则表达式获取富文本框中所有图片路劲
    ActiveMQ入门实例(.NET)
    ActiveMQ的使用以及应用场景
    关于消息队列的使用方法(RocketMQ)
    Redis系列 需要注意事项
    .NET:在线悲观锁、在线乐观锁、离线悲观锁、离线乐观锁代码示例
    C# 简单介绍Redis使用
    API Get跟Post 的区别?
  • 原文地址:https://www.cnblogs.com/dshore123/p/9295335.html
Copyright © 2020-2023  润新知