装修模式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变种很多,如果都采取继承方法,将会产生很多子类,显然相当繁琐.

装饰器

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值