浅谈装修模式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写数据...");

}

}

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

public class Decorator implements IUsb{
 private IUsb usb;

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

 private ArrayList others = new ArrayList();

public Decorator(IUsb _usb){
 usb = _usb;
 }

}

 

public class Decorator implements IUsb{
 private IUsb usb;

public Decorator(IUsb _usb){
 usb = _usb;
 }

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

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

// 音乐播放器,提供播放音乐的功能
public class MusicPlayer extends Decorator{
 public MusicPlayer(IUsb usb){
 super(usb);
 }

public void playMusic(){
 System.out.println("播放音乐...");
 }
}

// 照相机
public class Camera extends Decorator{
 public Camera(IUsb usb){
 super(usb);
 }

public void takePicture(){
 System.out.println("照相...");
 }
}

public class TestDecorator{
 public static void main(String[] args){
 IUsb mp3player = new MP3Player(); //只能读写数据的mp3
 MusicPlayer player = new MusicPlayer(mp3player) //装饰音乐播放
 player.readData();
 player.writeData();
 player.playMusic(); //具有播放音乐的功能

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


 

 

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

装饰器

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

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

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

 

 

 

 

你可能感兴趣的:(java,Decorator,String,Class,音乐,interface)