装饰器模式能够在运行时动态的为原始对象增加一些额外的功能,使其变得更加强大
与继承的区别:继承是在编译时静态的通过对原始类完成增强
在java.io包中,大量应用到装饰器模式,例如一系列的流处理类InputStream、FileInputStream、BufferedInputStream、ZipInputStream
等
new BufferedInputStream(new FileInputStream("example.txt"))
举个例子 新房装修
需要定义一个接口(组件接口)
该接口指定进行装饰的行为方法
public interface House {
// 装修
public void decorator();
}
定义实现类(组件实现)
表示需要被装饰的组件,只具备自身没有被装饰的原始特性
// 我的新家
public class MyHome implements House{
@Override
public void decorator() {
System.out.println("毛坯房");
}
}
定义装饰器抽象类
,同样实现组件接口标准,且包含一个被装饰的组件
这里使用了抽象类 为了不允许用户直接实例化此类
public abstract class HouseDecorator implements House{
House house;// 需要被装饰的对象
public HouseDecorator(House house){
this.house = house;
}
@Override
public void decorator() {
house.decorator();
}
}
装饰器实现:继承装饰器抽象类,进行多种实现
,在组件的基础上添加新的特性,各个装饰器类独立运行,各司其职
// 装修花园
public class DecorateGarden extends HouseDecorator{
public DecorateGarden(House house) {
super(house);// 调用抽象父类的构造注入 即可调用父类的decorator方法
}
@Override
public void decorator() {
System.out.println("装修花园");
house.decorator();
}
}
// 装修房间
public class DecorateRoom extends HouseDecorator{
public DecorateRoom(House house) {
super(house); // 调用抽象父类的构造注入 即可调用父类的decorator方法
}
@Override
public void decorator() {
System.out.println("装修卧室");
house.decorator();
}
}
// 装修卫生间
public class DecorateWashroom extends HouseDecorator{
public DecorateWashroom(House house) {
super(house);// 调用抽象父类的构造注入 即可调用父类的decorator方法
}
@Override
public void decorator() {
System.out.println("装修卫生间");
house.decorator();
}
}
各个不同的装修功能分开运行,这样可以实现不同功能的自由搭配
当开始装修的时候
public class Start {
public static void main(String[] args) {
House house = new DecorateGarden(
new DecorateRoom(new DecorateWashroom(
new MyHome())));
house.decorator();
}
}
分步开始进行装修,可以根据自己的需求,随意搭配装饰器
流程图:
再举一个发短信的例子
public interface SendMsg {
void sendMessage();
}
起初只能发文字短信
public class Msg implements SendMsg{
@Override
public void sendMessage() {
System.out.println("只能发短信");
}
}
添加发短信功能装饰器
public abstract class MsgDecorator implements SendMsg{
// 注意这里是SendMsg对象 不是最基础的原始组件实现类Msg
SendMsg msg;
public MsgDecorator(SendMsg msg){
this.msg = msg;
}
@Override
public void sendMessage() {
// 作用
msg.sendMessage();
}
}
后面开始出现QQ 可以发送表情包
public class QQ extends MsgDecorator{
// 注意这里构造函数里是SendMsg对象不是原始组件Msg类
public QQ(SendMsg msg) {
super(msg);
}
@Override
public void sendMessage() {
// 作用
System.out.println("可以发表情包");
msg.sendMessage();
}
}
然后出现微信
public class Wechat extends MsgDecorator{
// 这里是SendMsg对象 不是组件实现类Msg
public Wechat(SendMsg msg) {
super(msg);
}
@Override
public void sendMessage() {
// 作用
System.out.println("可以打视频");
msg.sendMessage();
}
}
组装起来
public class Start {
public static void main(String[] args) {
SendMsg msg = new Wechat(new QQ(new Msg()));
msg.sendMessage();
}
}
即可得到自己想要的结果