设计模式--装饰模式
装饰模式,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
M(超级玛丽)
--------------------------
普通继承模式实现
A 发镖 能组合出七种功能 M1: A M4:A B
B 变身 M2: B M5:A C
C 无敌 M3: C M6:B C M7:A B
---------------------------
M
|--M1 A B 组合方法 : new M2(M1)
|--M2 A C 组合方法 : new M3(M1)
|--M3 B C 组合方法 : new M3(M2)
A B C组合方法: new M3(M2(M1))
====================================
IUsb(接口,其功能为读数据与写数据)
|--UDisk(类 继承IUsb,其方法只有读写数据)
|--MP3Player(类 继承IUsb,其方法只有读写数据)
|--Decorator(IUsb iusb)
|--MusicPlayer(IUsb usb)
|--Camera(IUsb usb)
public interface IUsb{
public void readData();
public void writeData();
}
//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;
public Decorator(IUsb _usb){
usb = _usb;
}
public void readData(){//其实执行的是IUSB的ReadData
usb.readData();
}
public void writeData(){//其实执行的是IUSB的WriteData
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(); //具有照相的功能
}
}
在此程序中反复用到了抽象类、接口、继承及覆盖,而对此又有了新的深入见解。