java设计模式之装饰设计模式

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

装饰设计模式

什么是装饰设计模式(Decoration design patterns)呢?当想要对已有的对象进行功能增强时,可以自定义类,将已有对象对象传入,基于已有的功能,并提供加强功能。那么自定义的该类称为装饰类。

装饰类通常会通过构造方法接受被装饰的对象。并基于被装饰的对象的功能,提供更强的功能。

我们知道IO流中Bufferedwrite()和BufferedReader就是属于装饰类的一种,现在我们通过一个简单程序来看看装饰设计模式的例子:

/*

以前人们出去都是走路

在run方法里描述

*/

class Person

{

public void run(){

System.out.println("走路");

}

}

/*

现代的人们出去的方式更多了

以前的功能需要增强,自定义了一个增强类

称为装饰类

*/

class ModernPerson

{

private Person p;

ModernPerson(Person p){

this.p=p;

}

public void run(){ //增强方法

p.run();

System.out.println("自行车");

System.out.println("电动车");

System.out.println("公交车");

}

}

class DecorationDesignPatternsDemo

{

public static void main(String[] args)

Person p=new Person();

//p.run();需求不够,被弃用,使用装饰类里的增强型run方法

ModernPerson mp=new ModernPerson(p);//将以前Person对象传给装饰类的构造方法

mp.run();//增强性run方法。

}

}

很多人就会疑惑了,我们可以使用继承去实现啊?但是如果使用继承的话,我们来看看继承的使用与装饰类的区别:

我们假设一个体系MyReader是父类中的最顶层,父类下面有三个子类MyTxtReader,MyMediaReader,MyDataReader。而这三个类是由于功能上的不足,我们分别继承这三个类来增强功能。MyBufferedTxtReader,MyBufferedMediaReader,MyBufferedDataReader。

我们看到一个MyReader体系:

MyReader

|--MyTxtReader

|-- MyBufferedTxtReader

|-- MyMediaReader

|-- MyBufferedMediaReader

|-- MyDataReader

|-- MyBufferedDataReader

我们想通过一个类来使用传特定对象的方式,哪部分需要增强我们就传那部分的对象。所以看下面

class MyBufferedReader{

MyBufferedReader(MyTxtReader text){}

MyBufferedReader(MyMediaReader media){}

MyBufferedReader(MyDataReader data){}

我们看到上面MyReader因为需求如果又出现了很多的子类,那么就又得在内部改代码,这样麻烦。可以看到上面的这个类扩展性极差。

那么我们怎么办呢?我们想到我们何不找一个期参数的共同类型,通过一种多态的形式来提高扩展性。那么我们知道MyReader是父类的顶层,我们把他作为参数类型。

class MyBufferedReader extends MyReader(){

MyBufferedReader(MyReader r){};

那么我又看到MyReader的体系发生了变化

MyReader

|--MyTxtReader

|-- MyMediaReader

|-- MyDataReader

|--MyBufferedReader

我们看到装饰模式比继承要灵活的多。避免了继承体系的臃肿。而且降低了类与类之间的关

我们知道装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能。所以装饰类和被装饰类都属于一个体系中的。

其实我所说的就是IO流中体系,我们看看IO流中的装饰设计模式。我在这呢我复写了BufferedReader的readLine方法并继承了Reader类。

import java.io.*;

class MyBuffered extends Reader

{

private Reader fr;

MyBuffered(Reader fr){

this.fr=fr;

}

//复写了父类的readLine

public String readLine()throws IOException{

StringBuilder sb=new StringBuilder();

int i=0;

while((i=fr.read())!=-1){

if(i=='\r')

continue;

if(i=='\n')

return sb.toString();

else

sb.append((char)i);

}

if(sb.length()!=0){

return sb.toString();

}

return null;

}

//父类中的抽象方法必须要写

public int read(char[] cbuf,int off,int len)throws IOException{

return fr.read(cbuf,off,len);

}

//父类中的抽象方法必须要写

public void close()throws IOException{

fr.close();

}

}

class MyBufferedDemo

{

public static void main(String[] args) throws IOException

相关文档
最新文档