装饰者模式

1、定义及作用

定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。
设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。

2、涉及角色

抽象构件角色:定义一个抽象接口,来规范准备附加功能的类。

具体构件角色:将要被附加功能的类,实现抽象构件角色接口。

抽象装饰者角色:持有对具体构件角色的引用并定义与抽象构件角色一致的接口。

具体装饰角色:实现抽象装饰者角色,负责为具体构件添加额外功能

3、示例
1、 Work.java 接口
2、 Son.java 被装饰者-负责画画
3、 Mother.java 装饰者-负责上颜色
4、 Father.java 装饰者-负责装画框
5、 DecoratorTest.java 带有main方法的测试类

package decorator;
public interface Work {
public void paint();
}

package decorator;
public class Son implements Work {
public void paint() {
System.out.println("儿子用铅笔画好了一幅画。");
}
}

package decorator;
public class Mother implements Work {
//被装饰者
private Work work;

public Mother(Work work) {
this.work = work;
}

private Mother() {}
public void paint() {

//妈妈装饰者做的职责
System.out.println("妈妈正在做给画上颜色前的准备工作。");

//被装饰者做的职责
work.paint();

//妈妈装饰者做的职责
System.out.println("妈妈给画上好了颜色。");
}
}

package decorator;
public class Father implements Work {
//被装饰者
private Work work;

public Father(Work work) {
this.work = work;
}

private Father() {}
public void paint() {

//爸爸装饰者做的职责
System.out.println("爸爸正在做上画框前的准备工作。");

//被装饰者做的职责
work.paint();

//爸爸装饰者做的职责
System.out.println("爸爸给画装好了一个画框。");
}
}

package decorator;
public class DecoratorTest {
public static void main(String[] args) {

//只画铅笔画
Work work = new Son();
work.paint();
System.out.println("\n");

//除了画铅笔画,还要给画上颜色
work = new Mother(work);
work.paint();
System.out.println("\n");

//除了画铅笔画,给画上颜色,还要给画上画框
work = new Father(work);
work.paint();

}
}


输出:
儿子用铅笔画好了一幅画。

妈妈正在做给画上颜色前的准备工作。
儿子用铅笔画好了一幅画。
妈妈给画上好了颜色。

爸爸正在做上画框前的准备工作。
妈妈正在做给画上颜色前的准备工作。
儿子用铅笔画好了一幅画。
妈妈给画上好了颜色。
爸爸给画装好了一个画框。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值