设计模式--装饰模式

来源:互联网 发布:Java 日志 不需要判断 编辑:程序博客网 时间:2024/04/29 22:36

设计模式--装饰模式

装饰模式,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

M(超级玛丽)

--------------------------

普通继承模式实现

发镖 能组合出七种功能 M1: A M4:A B  

变身 M2: B M5:A 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(){//其实执行的是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(); //具有照相的功能

}

}

在此程序中反复用到了抽象类、接口、继承及覆盖,而对此又有了新的深入见解。

原创粉丝点击