zoukankan      html  css  js  c++  java
  • 装饰者模式

      1 package com.beiwo.Io;
      2 
      3 import java.io.BufferedReader;
      4 import java.io.FileReader;
      5 import java.io.IOException;
      6 
      7 /*
      8  
      9           需求1 :BufferedReader拓展实现通过readLine读取代码  ,每一行加上一个行号。
     10           需求2 :BufferedReader拓展实现通过readLine读取代码  ,每一行加上一个分号。
     11           需求5 :BufferedReader拓展实现通过readLine读取代码  ,每一行加上一个分号 + 行号。
     12           
     13           
     14           需求3 :BufferedReader拓展实现通过readLine读取代码  ,每一行加上一个引号。
     15           
     16   //=========================================================
     17           需求4 :BufferedReader拓展实现通过readLine读取代码  ,每一行加上一个引号 + 行号。
     18       
     19           需求6 :BufferedReader拓展实现通过readLine读取代码  ,每一行加上一个分号 + 引号。
     20           需求7 :BufferedReader拓展实现通过readLine读取代码  ,每一行加上一个分号 + 引号 + 行号。
     21  
     22    装饰者模式 :  增强一个类的功能还可以让装饰者类之间互相装饰。
     23    
     24    使用装饰者模式的步骤:
     25     1.装饰者类中需要维护一个被装饰者类的引用。 引用就是你需要拓展功能的类。
     26     2.让一个装饰类有一个共同的父类或者是父接口  : 可以让装饰者类之间互相装饰
     27     
     28     装饰者模式和继承的区别:
     29         继承实现的增强类:
     30         优点:代码结构清晰,而且实现简单
     31         缺点:对于每一个的需要增强的类都要创建具体的子类来帮助其增强,这样会导致继承体系过于庞大。
     32     装饰模式实现的增强类:
     33         优点:内部可以通过多态技术对多个需要增强的类进行增强
     34         缺点:需要内部通过多态技术维护需要增强的类的实例。进而使得代码稍微复杂。
     35 
     36  37  */
     38 
     39 //带行号的
     40 class BufferedReadLineNum1 extends BufferedReader{
     41     
     42     //内部维护的被装饰者类
     43     BufferedReader bufferedReader;
     44     
     45     int count = 1;
     46     
     47     public BufferedReadLineNum1(BufferedReader read) throws IOException{
     48         super(read); // 意义就用保证不报错。
     49         this.bufferedReader = read;
     50     }
     51     
     52     //开始拓展功能
     53     public String  readLine() throws IOException {
     54         //调用被组装饰者类的拓展方法
     55         String content = bufferedReader.readLine(); //构造方法中传的是哪一个对象,调用的就是谁的方法。
     56         
     57         if(content == null){
     58             
     59             return null;
     60         }
    62 content = count+" "+content; 63 count++; 64 return content; 65 } 67 } 68 69 //带分号的 70 class BufferedReadLineSemi1 extends BufferedReader{ 71 72 //内部维护的被装饰者类 73 BufferedReader bufferedReader; 74 76 public BufferedReadLineSemi1(BufferedReader read) throws IOException{ 77 super(read); // 意义就用保证不报错。 78 this.bufferedReader = read; 79 } 80 81 //开始拓展功能 82 public String readLine() throws IOException { 83 //调用被组装饰者类的拓展方法 84 //多态 可以是先互相装饰 85 String content = bufferedReader.readLine(); 86 87 if(content == null){ 88 89 return null; 90 } 91 92 return content+";"; 93 } 94 95 } 96 97 //带引号的 98 class BufferReaderLineMark extends BufferedReader{ 99 100 //1.内部需要一个被装饰类的引用 101 BufferedReader bufferedReader ; 102 103 public BufferReaderLineMark(BufferedReader read){ 104 105 super(read); 106 107 this.bufferedReader = read; 108 } 109 110 //开始拓展功能 111 public String readLine() throws IOException { 112 //调用被装饰者类的拓展方法 113 //多态 可以是先互相装饰 114 String content = bufferedReader.readLine(); 115 116 if(content == null){ 117 118 return null; 119 } 120 121 return """+content+"""; 122 } 124 } 156 public class Demo2 { 157 158 public static void main(String[] args) throws IOException { 159 160 //1.开启一个通道,并且带一个文件路径 161 FileReader reader = new FileReader("C:\Users\Administrator\Desktop\ttt.txt"); 162 //2.创建缓冲流 163 BufferedReader bufferedReader = new BufferedReader(reader); 164 //5.创建一个带引号的 165 BufferReaderLineMark lineMark = new BufferReaderLineMark(bufferedReader); 166 //3.创建一个带行号和引号的 167 BufferedReadLineNum1 lineNum1 = new BufferedReadLineNum1(lineMark); 172 //4.创建一个带行号和引号和分号的 173 BufferedReadLineSemi1 lineSemi1 = new BufferedReadLineSemi1(lineNum1);
    175         String content = null;
    176         while((content = lineSemi1.readLine())!=null){
    177             
    178             System.out.println(content);
    179         }
    180         
    181         //关闭资源
    182         lineSemi1.close();
    183         
    184     }
    185 }
    
    

     这个装饰者就很好的用到了面向对象的特点,继承、多态,

    1.因为有继承才可以有多个类去对一个方法进行拓展,

    2.因为有多态所以它们的构造器传入的参数类型不唯一,这样可以完成对不同类的装饰(在不同类的基础上进行功能拓展),

  • 相关阅读:
    CSS書寫規範及CSS Hack
    C#中为什么不能再方法里定义静态变量(Static)
    本机操作Excel文件提示错误:未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序。
    C#中静态变量和 静态方法的作用
    C#静态构造函数和非静态构造函数
    C# 判断字符串为空的4种方法及效率
    ASP.NET反射
    C#排序1(冒泡排序、直接排序、快速排序)
    javascript、jquery 、C#、sqlserveer、mysql、oracle中字符串截取的区别和用法
    MySQL数据库不识别server=.而是识别localhost
  • 原文地址:https://www.cnblogs.com/WNof11020520/p/7181426.html
Copyright © 2011-2022 走看看