JAVA设计模式-装饰设计模式-继承体系的由来和装饰类的优化

首先看一下我们设计类的过程:

专门用于读取数据的类

MyReader

l--MyTextReader:根据不同的功能会不断延伸很多子类

l--MyMeidaReader

l--MyDataReader

l--..........

为了提高以上子类的工作效率,需要加入缓冲区技术。所以又会出现下面的类的继承体系。

(体系1)

MyReader

l--MyTextReader:根据不同的功能会不断延伸很多子类

l--MyBufferedTextReader

l--MyMeidaReader

l--MyBufferedMediaReader

l--MyDataReader

l--MyBufferedDataReader

l--....................

那么随着这个类,不断的由新的子类出现,都要对这些子类进行功能的增强。而又都要通过子类的子类

去实现功能的增强。显然这样的它的扩展性不好,而且类的继承体系比较繁琐。

然而,功能增强所用的技术都是某一种技术(比如缓冲区技术)。

于是,java继承体系的架构就想到了,可不可以将这个功能增加的子类给抽取出来呢。

装饰类,就是他们最终选择的技术。

看下面这个类设计:

Class MyBufferedReader

{

MyBufferedReader(MyTextReader r){}

MyBufferedReader(MyMediaReader r){}

MyBufferedReader(MyDataReader r){}

......

}

为了让上面的类更加优化,我们找出参数的共同属性,所以选择父类对象作为参数传递。

那么上面可以有化成如下,同时需要继承上一层父类。因为他也要具备MyReader的功能。

Class MyBufferedReader extend MyReader

{

Private MyReader r

MyBufferedReader(MyReader r)

{

this.r=r

}

//利用缓冲区技术进行功能增强。

........

}

注意:如果父类是抽象类,需要实现父类中的所有抽象方法。

如此上面设计出来的继承体系就变化成下面这样:

(体系2)

MyReader

l--MyTextReader:根据不同的功能会不断延伸很多子类

l--MyBufferedTextReader

l--MyMeidaReader

l--MyBufferedMediaReader

l--MyDataReader

l--MyBufferedDataReader

l--.MyBufferedReader:装饰类

那么比较体系2和体系1:得出的结果是体系2的结构更为优化,便于扩展。

总结:

装饰类的出现,是类的继承体系中。为了增强多种子类的功能继续通过继承给每个子类添加具备了新功能的子类。

而这个新功能又是运用同一种技术,比如说java的缓冲区技术。这时候,我们可以不再使用继承的方式,通过子类

实现,而是通过装饰类的方式,将父类的对象做为参数传递给一个装饰类的构造函数来简化顶层父类的继承体系。

这样也更好的使得体系便于扩展。从软件工程的角度来讲,也降低了耦合性。

JAVA设计模式-装饰设计模式-继承体系的由来和装饰类的优化

时间: 2024-10-08 02:36:47

JAVA设计模式-装饰设计模式-继承体系的由来和装饰类的优化的相关文章

JAVA学习第四十九课 — IO流(三):缓冲区2 & 装饰设计模式

一.模拟BufferedReader 自定义MyBuffereaReader 对于缓冲区而言,里面其实就是封装一个数组,对外提供方法对数组的操作,这些方法最终操作的都是数组的角标 原理:从源中取出数据存入缓冲区,再从缓冲区不断的取出数据,取完后,继续从源中继续取数据,进缓冲区,直至源中的数据取完,用-1做为结束标记 import java.io.*; class MyBufferedReader { private FileReader fr; //定义数组作为缓冲区 private char[

java中的装饰设计模式,浅谈与继承之间的区别

最初接触装饰设计模式,一直搞不懂这么做的意义是什么,看了网上很多的资料,对于与继承的区别并没有很清楚的分析,直到看到这篇博客:http://www.cnblogs.com/rookieFly-tdiitd/p/4914593.html 这篇就很清楚的解释了装饰设计模式与继承之间的区别.下面是我自己的一些理解. 一.概念 装饰模式又称为包装模式,动态地给对象添加功能,是继承关系的一种替代方法. 二.选择 子类通过继承也能增加功能,但是关于装饰模式与继承之间如何选择,请看下面的例子. 假设:煎饼是父

java装饰设计模式的由来

装饰设计模式:基于已经存在的功能,提供增强的功能 装饰设计模式的由来: Reader   ----TextReader  ----MediaReader 要为子类提供缓冲读的功能 Reader   ----TextReader        ----BufferedTextReader   ----MediaReader       -----BufferedMediaReader Reader   ----TextReader        ----BufferedTextReader   -

Java:装饰设计模式

装饰设计模式: 当想要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有的功能, 并提供加强功能,那么自定义的该类就称为装饰类. 装饰类通常通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的 功能. //例子1: class Person { public void chifan() { System.out.println("吃饭"); } } class SuperPerson { private Person p; public SuperPerso

Java软件设计模式------装饰设计模式

Java软件设计模式一共分为23种; 一般常用的有: 单例设计模式 装饰设计模式 工厂设计模式 装饰设计模式 定义:英文叫Decorator Pattern,又叫装饰者模式.装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 在生活中我们用程序员和项目经理的例子来比喻,项目经理是从程序员开始的,经过不断地积累工作经验.不断的学习新的知识,才有可能升职. 在装饰设计模式中项目经理就是程序员的增强. 程序猿: 写程序 项目

Java Web总结二十Filter、装饰设计模式

一.Filter的部署--注册Filter <filter> <filter-name>testFitler</filter-name> <filter-class>org.test.TestFiter</filter-class> <init-param> <param-name>word_file</param-name> <param-value>/WEB-INF/word.txt</p

装饰设计模式,以及它与继承的区别

对一组对象进行功能的增强,就可以使用到这个模式. 装饰设计模式与继承的区别? 都可以对对象的功能进行扩展,但是如果是继承,那么就需要一个继承体系,如果该对象要提高效率,就会出现为了提高效率而进行的继承,这会导致整个体系越来越臃肿,不够灵活. 装饰设计模式比继承更加灵活,不需要产生继承关系. 装饰类与被装饰类要同属于一个接口或父类. 原文地址:https://www.cnblogs.com/olddriver123/p/8274956.html

java装饰设计模式

将一个对象作为参数进行传递,然后对这个对象进行包装---改变其中的方法或者添加一些新的行为---装饰设计模式---装饰者模式---Decorate Model 改变一个方法: 1. 通过继承这个类,然后重写其中的方法 2. 通过对象的传递创建装饰对象,在装饰类中重新提供对应的方法继承的缺点: 1. 单继承 2. 利用向上造型创建了一个父类对象,可以调用子类中重写方法,不能在使用父类中原来的方法 3. 如果父类对象已经存在,不能使用子类中重写之后的方法 装饰设计模式的缺点: 可能提高代码的冗余度-

java 装饰设计模式

今天讲下设计模式中的装饰设计模式,这个在我门的IO流已经使用到了,首先看下对装饰设计模式的定义 定义: 动态的给一个对象添加一些额外的功能,就新增功能来说,装饰模式比生成子类更加灵活. 总结起来装饰设计模式2个作用: 2个作用 1:为对象添加功能, 2:添加功能是动态的 装饰器模式具有如下的特征: 它必须具有一个装饰的对象. 它必须拥有与被装饰对象相同的接口. 它可以给被装饰对象添加额外的功能. 用一句话总结就是:保持接口,增强性能 现在用代码实现以下更为直观 比如手机只能打电话,那我现在想打电