装饰器模式

装饰器模式是为已有的功能动态添加更多功能的一种方式。他把每个要装饰的功能放在单独的类中,并让这个类包装他要装饰的对象。因此,当需要执行特殊行为时,客户代码就可以根据需要有选择的、按顺序的使用装饰功能包装对象了。

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

主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

何时使用:在不想增加很多子类的情况下扩展类。

如何解决:将具体功能职责划分,同时继承装饰者模式。

关键代码: 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值