浅谈装修模式decorator

今天上课时老师提到了decorator装修模式,觉得还是很有意思的,就在网上搜集了,相关资料,现在结合自己的理解写在下面,如有不对的地方请各位大虾拍砖指教。

总结:

decorator装修模式的目的:

简化继承派生模式,使用“即插即用”,增加灵活性与使用性。

实现:

实现动态的为对象添加功能,是从一个对象外部来给对象增加功能,相当于是改变了对象的外观。当装饰过后,从外部使用系统的角度看,就不再是使用原始的那个对象了,而是使用被一系列的装饰器装饰过后的对象。

M

--------------------------
普通继承模式实现
A
B
C

M1: A
M2: B
M3: C

M4:A B
M5:A C
M6:B C
M7:A B C

---------------------------
装饰模式
M
|--M1
|--M2
|--M3


A B : new M2(M1)
A C : new M3(M1)
B C : new M3(M2)
A B C : new M3(M2(M1))

我们先建立一个接口:

public interface IUsb{
public void readData();
public void writeData();
}

接口u盘有一个具体实现:读数据,写数据,同理mp3

//U盘public class UDisk implements IUsb{

public void readData(){ System.out.println("U盘读数据...");

}

public void writeData(){

System.out.println("U盘写数据...");

}

}

public MP3Play implements IUsb{

public void readData(){

System.out.println("MP3读数据...");

}

public void writeData(){

System.out.println("MP3写数据...");

}

}

现在我们具备了基本功能,就应该添加的装饰功能,附加功能

publicclassDecoratorimplementsIUsb{
privateIUsbusb;

//额外增加的功能被打包在这个List中

 private ArrayList others = new ArrayList();

publicDecorator(IUsb_usb){
usb=_usb;
}

}

publicclassDecoratorimplementsIUsb{
privateIUsbusb;

publicDecorator(IUsb_usb){
usb=_usb;
}

publicvoidreadData(){//其实执行的是IUSBReadData
usb.readData();
}

publicvoidwriteData(){//其实执行的是IUSBWriteData
usb.writeData();
}
}

//音乐播放器,提供播放音乐的功能
publicclassMusicPlayerextendsDecorator{
publicMusicPlayer(IUsbusb){
super(usb);
}

publicvoidplayMusic(){
System.out.println("播放音乐...");
}
}

//照相机
publicclassCameraextendsDecorator{
publicCamera(IUsbusb){
super(usb);
}

publicvoidtakePicture(){
System.out.println("照相...");
}
}

publicclassTestDecorator{
publicstaticvoidmain(String[]args){
IUsbmp3player=newMP3Player();//只能读写数据的mp3
MusicPlayerplayer=newMusicPlayer(mp3player)//装饰音乐播放
player.readData();
player.writeData();
player.playMusic();//具有播放音乐的功能

Cameramp3Carm=newCamera(player);
mp3Carm.takePicture();//具有照相的功能
}
}


实际上Java 的I/O API就是使用decorator,I/O变种很多,如果都采取继承方法,将会产生很多子类,显然相当繁琐.

装饰器

装饰器实现了对被装饰对象的某些装饰功能,可以在装饰器里面调用被装饰对象的功能,获取相应的值,这其实是一种递归调用。

在装饰器里不仅仅是可以给被装饰对象增加功能,还可以根据需要选择是否调用被装饰对象的功能,如果不调用被装饰对象的功能,那就变成完全重新实现了,相当于动态修改了被装饰对象的功能。

另外一点,各个装饰器之间最好是完全独立的功能,不要有依赖,这样在进行装饰组合的时候,才没有先后顺序的限制,也就是先装饰谁和后装饰谁都应该是一样的,否则会大大降低装饰器组合的灵活性。

你可能感兴趣的:(Decorator)