Java设计模式(三)之装饰设计模式
2012-11-22 16:54
260 查看
-------android培训、java培训、期待与您交流! ----------
什么是装饰设计模式(Decoration design patterns)呢?当想要对已有的对象进行功能增强时,可以自定义类,将已有对象对象传入,基于已有的功能,并提供加强功能。那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接受被装饰的对象。并基于被装饰的对象的功能,提供更强的功能。
我们知道IO流中Bufferedwrite()和BufferedReader就是属于装饰类的一种,现在我们通过一个简单程序来看看装饰设计模式的例子:
/*
以前人们出去都是走路
在run方法里描述
*/
class Person
{
publicvoid run(){
System.out.println("走路");
}
}
/*
现代的人们出去的方式更多了
以前的功能需要增强,自定义了一个增强类
称为装饰类
*/
class ModernPerson
{
privatePerson p;
ModernPerson(Personp){
this.p=p;
}
publicvoid run(){ //增强方法
p.run();
System.out.println("自行车");
System.out.println("电动车");
System.out.println("公交车");
}
}
class DecorationDesignPatternsDemo
{
publicstatic void main(String[] args)
{
Personp=new Person();
//p.run();需求不够,被弃用,使用装饰类里的增强型run方法
ModernPersonmp=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(MyTxtReadertext){}
MyBufferedReader(MyMediaReadermedia){}
MyBufferedReader(MyDataReaderdata){}
}
我们看到上面MyReader因为需求如果又出现了很多的子类,那么就又得在内部改代码,这样麻烦。可以看到上面的这个类扩展性极差。
那么我们怎么办呢?我们想到我们何不找一个期参数的共同类型,通过一种多态的形式来提高扩展性。那么我们知道MyReader是父类的顶层,我们把他作为参数类型。
classMyBufferedReader extends MyReader(){
MyBufferedReader(MyReader r){};
}
那么我又看到MyReader的体系发生了变化
MyReader
|--MyTxtReader
|--MyMediaReader
|--MyDataReader
|--MyBufferedReader
我们看到装饰模式比继承要灵活的多。避免了继承体系的臃肿。而且降低了类与类之间的关系。
我们知道装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能。所以装饰类和被装饰类都属于一个体系中的。
其实我所说的就是IO流中体系,我们看看IO流中的装饰设计模式。我在这呢我复写了BufferedReader的readLine方法并继承了Reader类。
import java.io.*;
class MyBuffered extends Reader
{
privateReader fr;
MyBuffered(Readerfr){
this.fr=fr;
}
//复写了父类的readLine
publicString readLine()throws IOException{
StringBuildersb=new StringBuilder();
inti=0;
while((i=fr.read())!=-1){
if(i=='\r')
continue;
if(i=='\n')
returnsb.toString();
else
sb.append((char)i);
}
if(sb.length()!=0){
return sb.toString();
}
returnnull;
}
//父类中的抽象方法必须要写
publicint read(char[] cbuf,int off,int len)throws IOException{
returnfr.read(cbuf,off,len);
}
//父类中的抽象方法必须要写
publicvoid close()throws IOException{
fr.close();
}
}
class MyBufferedDemo
{
publicstatic void main(String[] args) throws IOException
{
FileReaderfr=new FileReader("BufferedWriterDemo.txt");
MyBufferedmb=new MyBuffered(fr);
Strings=null;
while((s=mb.readLine())!=null){
System.out.println(s);
}
mb.close();
}
}
什么是装饰设计模式(Decoration design patterns)呢?当想要对已有的对象进行功能增强时,可以自定义类,将已有对象对象传入,基于已有的功能,并提供加强功能。那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接受被装饰的对象。并基于被装饰的对象的功能,提供更强的功能。
我们知道IO流中Bufferedwrite()和BufferedReader就是属于装饰类的一种,现在我们通过一个简单程序来看看装饰设计模式的例子:
/*
以前人们出去都是走路
在run方法里描述
*/
class Person
{
publicvoid run(){
System.out.println("走路");
}
}
/*
现代的人们出去的方式更多了
以前的功能需要增强,自定义了一个增强类
称为装饰类
*/
class ModernPerson
{
privatePerson p;
ModernPerson(Personp){
this.p=p;
}
publicvoid run(){ //增强方法
p.run();
System.out.println("自行车");
System.out.println("电动车");
System.out.println("公交车");
}
}
class DecorationDesignPatternsDemo
{
publicstatic void main(String[] args)
{
Personp=new Person();
//p.run();需求不够,被弃用,使用装饰类里的增强型run方法
ModernPersonmp=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(MyTxtReadertext){}
MyBufferedReader(MyMediaReadermedia){}
MyBufferedReader(MyDataReaderdata){}
}
我们看到上面MyReader因为需求如果又出现了很多的子类,那么就又得在内部改代码,这样麻烦。可以看到上面的这个类扩展性极差。
那么我们怎么办呢?我们想到我们何不找一个期参数的共同类型,通过一种多态的形式来提高扩展性。那么我们知道MyReader是父类的顶层,我们把他作为参数类型。
classMyBufferedReader extends MyReader(){
MyBufferedReader(MyReader r){};
}
那么我又看到MyReader的体系发生了变化
MyReader
|--MyTxtReader
|--MyMediaReader
|--MyDataReader
|--MyBufferedReader
我们看到装饰模式比继承要灵活的多。避免了继承体系的臃肿。而且降低了类与类之间的关系。
我们知道装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强的功能。所以装饰类和被装饰类都属于一个体系中的。
其实我所说的就是IO流中体系,我们看看IO流中的装饰设计模式。我在这呢我复写了BufferedReader的readLine方法并继承了Reader类。
import java.io.*;
class MyBuffered extends Reader
{
privateReader fr;
MyBuffered(Readerfr){
this.fr=fr;
}
//复写了父类的readLine
publicString readLine()throws IOException{
StringBuildersb=new StringBuilder();
inti=0;
while((i=fr.read())!=-1){
if(i=='\r')
continue;
if(i=='\n')
returnsb.toString();
else
sb.append((char)i);
}
if(sb.length()!=0){
return sb.toString();
}
returnnull;
}
//父类中的抽象方法必须要写
publicint read(char[] cbuf,int off,int len)throws IOException{
returnfr.read(cbuf,off,len);
}
//父类中的抽象方法必须要写
publicvoid close()throws IOException{
fr.close();
}
}
class MyBufferedDemo
{
publicstatic void main(String[] args) throws IOException
{
FileReaderfr=new FileReader("BufferedWriterDemo.txt");
MyBufferedmb=new MyBuffered(fr);
Strings=null;
while((s=mb.readLine())!=null){
System.out.println(s);
}
mb.close();
}
}
相关文章推荐
- java设计模式:装饰器模式[Decorator]
- java设计模式之装饰设计模式
- java与设计模式之装饰装者模式
- Java设计模式十九:装饰模式(Decorator Pattern)
- Java设计模式之装饰模式
- Java装饰设计模式
- Java 设计模式 --装饰模式
- Java设计模式:装饰设计模式
- JAVA--装饰模式(Decorator)--设计模式七
- JAVA之旅(二十六)——装饰设计模式,继承和装饰的区别,LineNumberReader,自定义LineNumberReader,字节流读取操作,I/O复制图片
- (三)Java设计模式--装饰器模式
- (三)Java设计模式--装饰器模式
- 【javaweb:Filter】通过过滤器和装饰设计模式解决request的全局乱码
- JAVA设计模式——装饰设计模式
- 黑马程序员 java学习笔记3-IO流之字节流与装饰设计模式
- 黑马程序员----java设计模式之装饰设计模式和享元设计模式
- java设计模式(六)---装饰器模式
- JAVA基础——装饰设计模式
- 设计模式之装饰模式Java实现
- java学习之IO装饰设计模式