装饰器模式是为已有的功能动态添加更多功能的一种方式。他把每个要装饰的功能放在单独的类中,并让这个类包装他要装饰的对象。因此,当需要执行特殊行为时,客户代码就可以根据需要有选择的、按顺序的使用装饰功能包装对象了。
意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。
何时使用:在不想增加很多子类的情况下扩展类。
如何解决:将具体功能职责划分,同时继承装饰者模式。
关键代码: 1、Component 类充当抽象角色,不应该具体实现。 2、修饰类引用和继承 Component 类,具体扩展类重写父类方法。
应用实例: 1、孙悟空有 72 变,当他变成"庙宇"后,他的根本还是一只猴子,但是他又有了庙宇的功能。 2、不论一幅画有没有画框都可以挂在墙上,但是通常都是有画框的,并且实际上是画框被挂在墙上。在挂在墙上之前,画可以被蒙上玻璃,装到框子里;这时画、玻璃和画框形成了一个物体。
实例UML图
代码如下:
/**
* @author Shuyu.Wang
* @package:com.shuyu.decorator
* @description:
* @date 2018-11-09 22:02
**/
@Slf4j
public class Person {
public Person() {
}
private String name;
public Person(String name) {
this.name = name;
}
public void Show() {
log.info("装扮的" + name);
}
装饰类:
/**
* @author Shuyu.Wang
* @package:com.shuyu.decorator
* @description:服饰类
* @date 2018-11-09 22:06
**/
public class Finery extends Person{
protected Person component;
//装饰方法
public void Decorate(Person component){
this.component=component;
}
@Override
public void Show() {
if (component!=null){
component.Show();
}
}
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.decorator
* @description:具体服饰类-球鞋
* @date 2018-11-09 22:14
**/
@Slf4j
public class Sneakers extends Finery{
@Override
public void Show() {
log.info("球鞋");
super.Show();
}
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.decorator
* @description:具体服饰类-T恤类
* @date 2018-11-09 22:10
**/
@Slf4j
public class TShirts extends Finery {
@Override
public void Show() {
log.info("大T恤");
super.Show();
}
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.decorator
* @description:具体服饰类-皮鞋
* @date 2018-11-09 22:19
**/
@Slf4j
public class LeatherShoes extends Finery {
@Override
public void Show() {
log.info("皮鞋");
super.Show();
}
}
/**
* @author Shuyu.Wang
* @package:com.shuyu.decorator
* @description:具体服饰类-垮裤类
* @date 2018-11-09 22:12
**/
@Slf4j
public class BigTrouser extends Finery{
@Override
public void Show() {
log.info("垮裤。。。。");
super.Show();
}
}
运行结果如下:
2018-11-09 22:48:02.808 INFO 36536 --- [ main] com.shuyu.DecoratorApplicationTests : 第一种打扮
2018-11-09 22:48:02.809 INFO 36536 --- [ main] com.shuyu.decorator.TShirts : 大T恤
2018-11-09 22:48:02.809 INFO 36536 --- [ main] com.shuyu.decorator.BigTrouser : 垮裤。。。。
2018-11-09 22:48:02.809 INFO 36536 --- [ main] com.shuyu.decorator.Sneakers : 球鞋
2018-11-09 22:48:02.810 INFO 36536 --- [ main] com.shuyu.decorator.Person : 装扮的小菜
2018-11-09 22:48:02.810 INFO 36536 --- [ main] com.shuyu.DecoratorApplicationTests : 第二种打扮
2018-11-09 22:48:02.810 INFO 36536 --- [ main] com.shuyu.decorator.TShirts : 大T恤
2018-11-09 22:48:02.810 INFO 36536 --- [ main] com.shuyu.decorator.LeatherShoes : 皮鞋
2018-11-09 22:48:02.810 INFO 36536 --- [ main] com.shuyu.decorator.Person : 装扮的小菜
git代码地址:https://github.com/iot-wangshuyu/designpatterns/tree/master/decorator