zoukankan      html  css  js  c++  java
  • 装饰设计模式简析

    装饰设计模式使用场景
    当想要对已有的对象进行功能增强时,可以定义类,
    将已有对象传入,基于已有功能,并提供加强功能,
    那么自定义的该类称为装饰类。
    装饰类通常会通过构造方法接受被装饰的对象,
    并基于被装饰对象的功能,提供更强的功能。
    装饰类因为增强已有对象,具备的功能和已有的是相同类型的,
    只不过要更强。所以装饰类和被装饰类通常是属于同一个体系之中的。

    装饰设计模式与继承
    装饰模式比继承要灵活,避免了继承体系的臃肿,
    而且减少了类与类之间的关系。

    装饰设计模式的应用举例:

    1.在Filter中,由于可以得到request和response对象,可以使用装饰器,对这两个对象进行包装,再把包装对象传给目标资源,从而实现一些特殊的需求。

    2.运用装饰设计模式,对FilerReader对象的功能进行增强
    基于read方法,提供一个读一行字符方法,写一个自己的字符输出流的缓冲区类(功能其实和BufferedReader相同),

    并对异常进行简单处理。

     1 class  MyBufferedReader
     2 {
     3     private FileReader fr;
     4     public MyBufferedReader(FileReader fr)
     5     {
     6         this.fr=fr;
     7     }
     8     public String myReadLine()throws IOException//声明异常,谁调用,谁解决
     9     {
    10         //定义一个字符缓冲区
    11         StringBuilder sb=new StringBuilder();
    12         int ch=0;
    13         while((ch=fr.read())!=-1)
    14         {
    15             if(ch=='
    ')
    16                 continue;
    17             if(ch=='
    ')
    18                 return sb.toString();
    19             else
    20                 sb.append((char)ch);
    21 
    22         }
    23         //防止因为文件末尾缺少'
    '而漏读
    24         if(sb.length()!=0)
    25             return sb.toString();
    26         return null;
    27 
    28     }
    29 
    30    //关闭输出流的缓冲区对象,实际执行的操作就是关闭输出流
    31     public void myBufClose()throws IOException//声明异常,谁调用,谁解决
    32     {
    33         fr.close();
    34     }
    35 }
    36 
    37 /*
    38 测试MyBufferedReader的功能,用其读取当前目录下的buffered.txt文件,
    39 并打印在控制台上。
    40 */
    41 public class  MyBufferedReaderTest
    42 {
    43     public static void main(String[] args) 
    44     {
    45         //为了使MyBufferedReader对象在整个main方法中可用,在try块外定义此对象
    46         MyBufferedReader mbr=null;
    47         try
    48         {
    49             mbr=new MyBufferedReader(new FileReader("buffered.txt"));
    50             String line=null;
    51             while((line=mbr.myReadLine())!=null)
    52             {
    53                 System.out.println(line);
    54             }
    55             
    56         }
    57         catch (IOException e)
    58         {
    59             throw new RuntimeException("发生读取错误");
    60         }
    61         //在finally块中关闭流
    62         finally
    63         {
    64             try
    65             {
    66                 if(mbr!=null)
    67                 mbr.myBufClose();
    68                 
    69             }
    70             catch (IOException e)
    71           {
    72             throw new RuntimeException("发生关闭错误");
    73           }
    74         }
    75     }
    76 }
  • 相关阅读:
    2019-09-29-阿里三面
    【Layui】在前端提交表单时验证密码是否正确
    【Mivik 的字符串公开赛A】大佬语录(广义后缀自动机)
    【2020ICPC南京J】Just Another Game of Stones(Nim博弈+吉老师线段树)
    【HDU-6291/2018CCPC女生赛E】对称数(散列+树上主席树)
    【计蒜客42547/2019ICPC徐州H】Yuuki and a problem(MEX性质+树套树)
    【HDU-6230/2017CCPC哈尔滨A】Palindrome(式子转换+马拉车+主席树)
    【HDU-6223/2017ICPC沈阳G】Infinite Fraction Path(后缀数组+超级快读)
    【HDU-5785】Interesting(回文串的性质+回文自动机+map空间优化)
    【CF-1452E】Two Editorials (贪心)
  • 原文地址:https://www.cnblogs.com/wsw-tcsygrwfqd/p/6425366.html
Copyright © 2011-2022 走看看