设计模式4:装饰模式(1)

  作用:

  基于已经存在的功能提供增强功能。

  将扩展的类作为新的类的构造函数参数传入,然后对这个类进行装饰处理。

  为了让装饰者有被装饰的功能,需要存在继承关系。

  简单的点讲就是为了扩展一个已定义好的类的功能,而不修改原来类的定义,原来的类仍然可以继续使用,现在定义一个新的类继承原来的类,同时在这个新的类中定义父类的成员变量,同时在构造方法中将外界的一个父类对象传给这个成员变量,然后既可以通过这个成员变量使用父类的方法,同时又可以增加新的方法实现对父类功能的扩充。例如IO流中很多类都采用了装饰模式,如BufferedReader类是装饰了Reader类,LineNumberReader类装饰了BufferedReader类。

  示例1:

 1 package com.qianfeng.decorator;
 2
 3 public class Demo12 {
 4
 5     public static void main(String[] args) {
 6         Person p1 = new Zhansan();
 7         p1.show();
 8
 9         Person p2 = new JeansDecorator(p1);
10         p2.show();
11
12         Person p3 = new ShirtDecorator(p1);
13         p3.show();
14     }
15 }
16
17 interface Person {
18     void show();// 显示一个人
19 }
20
21 abstract class DecoratorPerson implements Person {
22     private Person person;
23
24     DecoratorPerson(Person person) {
25         this.person = person;
26     }
27 }
28
29 class JeansDecorator extends DecoratorPerson {
30
31     JeansDecorator(Person person) {
32         super(person);
33         // TODO Auto-generated constructor stub
34     }
35
36     @Override
37     public void show() {
38         System.out.println("穿牛仔裤的person");
39
40     }
41 }
42
43 class ShirtDecorator extends DecoratorPerson {
44
45     ShirtDecorator(Person person) {
46         super(person);
47         // TODO Auto-generated constructor stub
48     }
49
50     @Override
51     public void show() {
52         System.out.println("穿t恤的person");
53
54     }
55
56 }
57
58 class Zhansan implements Person {
59
60     @Override
61     public void show() {
62         System.out.println("没有任何装饰的张三");
63
64     }
65
66 }

  示例2:

  1 package com.qianfeng.decorator;
  2
  3 import java.io.FileReader;
  4 import java.io.IOException;
  5 import java.io.Reader;
  6
  7 public class Demo13 {
  8     // LineNumberReader 装饰类,继承了BufferedReader
  9     public static void main(String[] args) throws IOException {
 10         FileReader fr = new FileReader("src/temp.txt");
 11         // LineNumberReader lnr = new LineNumberReader(fr);
 12         // String line = null;
 13         // lnr.setLineNumber(100);
 14         // while ((line = lnr.readLine()) != null) {
 15         // System.out.println(lnr.getLineNumber() + ":" + line);
 16         // }
 17         // lnr.close();
 18
 19         MyLineNumberReader lnr = new MyLineNumberReader(fr);
 20         String line = null;
 21         // lnr.setLineNumber(1000);
 22         while ((line = lnr.MyReadLine()) != null) {
 23             System.out.println(lnr.getLineNumber() + ":" + line);
 24         }
 25         lnr.myClose();
 26     }
 27
 28 }
 29
 30 /*
 31  * setLineNumber():设置起始行号
 32  *
 33  * myReadLine():每次读取一行
 34  *
 35  * getLineNumber():获得当前行号
 36  */
 37 class MyBufferedReader {
 38     private Reader r; // 真正读取功能的类
 39     private char[] arr = new char[512];// 相当于缓冲区
 40     private int index; // 数组下标
 41     private int count; // 统计缓冲区中字符个数
 42
 43     public MyBufferedReader(Reader r) {
 44         this.r = r;
 45     }
 46
 47     // 实现一次读取一个的功能
 48     public int myRead() throws IOException {
 49         // 缓冲区中是否有数据
 50         if (count == 0) {
 51             // 从文件中读取数据到缓冲区,返回值读取的字符数
 52             count = r.read(arr);
 53             index = 0; // 下标为0
 54         }
 55         if (count < 0) // 文件末尾
 56             return -1;
 57         // 从缓冲区中读取一个字符
 58         int num = arr[index];
 59         index++;// 下标+1
 60         // 数量-1
 61         count--;
 62         return num;
 63
 64     }
 65
 66     // 一次读取一行
 67     public String myReadLine() throws IOException {
 68         StringBuilder sb = new StringBuilder();
 69         int num;
 70         while ((num = myRead()) != -1) {
 71             if (num == ‘\r‘)
 72                 continue;
 73             else if (num == ‘\n‘)
 74                 return sb.toString();
 75             else
 76                 sb.append((char) num);
 77         }
 78         return null;
 79     }
 80
 81     // 关闭流
 82     public void myClose() throws IOException {
 83         r.close();
 84     }
 85 }
 86
 87 class MyLineNumberReader extends MyBufferedReader {
 88
 89     private int lineNumber;
 90
 91     public MyLineNumberReader(Reader r) {
 92         super(r);
 93     }
 94
 95     public void setLineNumber(int lineNumber) {
 96         this.lineNumber = lineNumber;
 97     }
 98
 99     public int getLineNumber() {
100         return this.lineNumber;
101     }
102
103     // 每次读取一行,行号+1
104     public String MyReadLine() throws IOException {
105         ++lineNumber;
106         return super.myReadLine();
107     }
108
109 }

  

  未完,待续。

  

  

时间: 2024-07-30 13:52:54

设计模式4:装饰模式(1)的相关文章

JAVA设计模式之 装饰模式【Decorator Pattern】

一.概述 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活.装饰模式是一种对象结构型模式.装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系.在装饰模式中引入了装饰类,在装饰类中既可以调用待装饰的原有类的方法,还可以增加新的方法,以扩充原有类的功能. 二.适用场景 装饰原有对象.在不改变原有对象的情况下扩展增强新功能/新特征..当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时可以使用装饰模式. 三.UML类图 四

设计模式之装饰模式20170726

结构型设计模式之装饰模式: 一.含义 动态地给一个对象添加一些额外的职责.就增加功能来说,装饰模式相比生成子类更为灵活. 通俗来讲,装饰模式是对类的功能进行加强或减弱. 二.代码说明 1.主要有两个角色 1)构件 最核心.最原始.最基本的对象,也就是要装饰的对象. 2)装饰角色 把最核心.最原始.最基本的东西装饰成其他东西 2.在用C实现过程中也是参考这种思想,以修饰成绩单举例,具体实现如下: 1)装饰模式使用场景: 1 /***********************************

跟我学设计模式视频教程——装饰模式,装饰模式VS代理模式

课程视频 装饰模式 装饰模式VS代理模式1 装饰模式VS代理模式2 课程笔记 课程笔记 课程代码 课程代码 新课程火热报名中 课程介绍 跟我学设计模式视频教程--装饰模式,装饰模式VS代理模式,布布扣,bubuko.com

设计模式之装饰模式 c++实现和详细分析

Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案. 它使功能具有动态性 已经开发完毕的对象,后期由于业务需要,对旧的对象需要扩展特别多的功能,这时候使用给对象动态地添加新的状态或者行为(即装饰模式)方法,而不是使用子类静态继承. 引入装饰模式的原因  : 由于若有很多个功能,这么多功能 可能会出现各种组合,而每个组合都要对应一个类,这是指数级的类的数量增长(因为我们要扩展不应直接修改类,所以采取继承 而不是改变原有类)  

【设计模式】——装饰模式

装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 装饰模式结构图: Component是定义一个对象接口,可以给这些对象动态地添加职责.ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责.Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的.至于ConcreteDecorator就是具体

学习大话设计模式06_装饰模式

装饰模式(Decorator): 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 1 /** 2 * Component 是定义一个对象接口,可以给这些对象动态地添加职责 3 * @author Monica 4 * 5 */ 6 public abstract class Component { 7 public abstract void Operation(); 8 } 9 10 11 /** 12 * ConcreteComponent 是定义了一个具体

设计模式开始--装饰模式

装饰模式 一.作用: 为已有的功能添加新的功能的设计模式,当系统需要新的功能时候,要在原有的基础上增加一点新的功能的时候,也就是装饰一点功能的时候,不需要再原有的代码上进行修改. 装饰的功能就是把核心职责和核心功能划分开了. 对比生成器模式: (1)生成器模式类执行是有顺序的 (2)装饰模式执行顺序是没有顺序的,是随机的,想怎么装饰就怎么装饰,装饰的是一些无关紧要的事情,核心的代码还是之前的类在做 二.类图 解释一下: 左边两个实现类(ConsoleLogger FileLogger)是核心的实

大话设计模式之装饰模式(包装模式)

装饰模式的结构 转发:http://www.cnblogs.com/java-my-life/archive/2012/04/20/2455726.html 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案 装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任.换言之,客户端并不会觉得对象在装饰前和装饰后有什么不同.装饰模式可以在不使用创造更多子类的情况下,将对象的功能加以扩展. 装饰模式的类图如下: 在装饰模式中的角色有: ●

Java——设计模式(装饰模式_IO)

 /* * 装饰设计模式: *  对一组对象的功能进行增强时,就能够使用该模式进行问题的解决; * 装饰和继承都能实现一样的特点:  就是进行功能的扩转增强. * */ public class TestIO4 { public static void main(String[] args) { Person p = new Person(); NewPerson np = new NewPerson(p); np.chifan();//使用增强后的功能. } } //原有的类 class 

设计模式之装饰模式--- Pattern Decorator

模式的定义 装饰模式的定义: Attach additional responsibilities to an object dynamically keeping the same interface.Decorators provide a flexible alternative to subclassing for extending functionality. 动态给一个对象添加一些额外的职责.就增加功能来说,装饰模式相比生成子类更为灵活. 类型 结构类 模式的使用场景 需要扩展一个