装饰者模式---包装,展现最好的自己

        声明:文章内容根据大牛博客的内容,自己理解后,给自己做的学习笔记,文末会附上大牛博客地址链接。有需要沟通交流的可加我QQ群:425120333 
        再解释装饰者模式之前,先罗列一个场景,现在网购因为价格实惠,种类繁多,越来越成为人们首选的购物方式,在网上购买了一个商品后,
    店家会将该商品包装起来,然后给物流公司,物流公司又会在加一层外包装盒,再进行配送。一件商品从店家到买家,至少经过了两层的包装。
    当然有些贵重的物品可能还有三层包装等,不管包装了多少层,核心的物品还是原来的商品,包装层相当于给该商品添加了额外的功能(保护商品、告知配送信息)
    ,也可以说是这些包装层就是对原先商品的修饰。在不改变原先商品的前提下,扩展了商品的功能。这就是这篇文章要讲解的装饰者模式。
        装饰者模式,就是在不改变原先产品的前提下,动态的给产品添加新的功能。上面的例子,用代码体现出来如下:
public class ShowGoods {
    public static void main(String[] args) {
        //声明一个具体商品
        AbstractGoods goods = new AGoods();
        goods.hasName();
        goods.hasPrice();
        System.out.println("-------------------分隔符-------------------");
        //经过店家包装
        goods = new StoreDecorateGoods(goods);
        goods.hasName();
        goods.hasPrice();
        System.out.println("-------------------分隔符-------------------");
        //再经过物流包装
        goods = new LogisticsDecorateGoods(goods);
        goods.hasName();
        goods.hasPrice();
        System.out.println("-------------------分隔符-------------------");

    }
}

/**
 * @introduce:抽象商品类
 * 
 */
abstract class AbstractGoods {
    //商品名字
    protected abstract void hasName();

    //商品价格
    protected abstract void hasPrice();
}

/**
 * @introduce:具体的商品A
 * 
 */
class AGoods extends AbstractGoods {

    @Override
    protected void hasName() {
        System.out.println("商品名字是A");

    }

    @Override
    protected void hasPrice() {
        System.out.println("商品价格是15");
    }

}

/**
 * @introduce:商品装饰器类
 * 
 */
class GoodsDecorator extends AbstractGoods {

    private AbstractGoods goods;

    public GoodsDecorator(AbstractGoods goods) {
        this.goods = goods;
    }

    @Override
    protected void hasName() {
        goods.hasName();
    }

    @Override
    protected void hasPrice() {
        goods.hasPrice();
    }

}

class StoreDecorateGoods extends GoodsDecorator {

    public StoreDecorateGoods(AbstractGoods goods) {
        super(goods);
    }

    /**
     * @introduce店家提示
     * 
     */
    public void storePrompt() {
        System.out.println("这层包装是为了避免弄脏商品");
    }

    @Override
    protected void hasName() {
        storePrompt();
        super.hasName();
    }

    @Override
    protected void hasPrice() {
        super.hasPrice();
    }

}

class LogisticsDecorateGoods extends GoodsDecorator {

    public LogisticsDecorateGoods(AbstractGoods goods) {
        super(goods);
    }

    /**
     * @introduce物流提示
     * 
     */
    public void logisticsPrompt() {
        System.out.println("这层包装是为了展示配送信息");
    }

    @Override
    protected void hasName() {
        super.hasName();
        logisticsPrompt();
    }

    @Override
    protected void hasPrice() {
        super.hasPrice();
    }

}

控制台输出:
商品名字是A
商品价格是15
——————-分隔符——————-
这层包装是为了避免弄脏商品
商品名字是A
商品价格是15
——————-分隔符——————-
这层包装是为了避免弄脏商品
商品名字是A
这层包装是为了展示配送信息
商品价格是15
——————-分隔符——————-

        通过查看输出能够发现已经达到想要的效果了,如果后面还要经过别的包装,只需要添加一个相应的装饰器类即可,这就是装饰者模式的简单使用。
        参考大牛链接:http://www.cnblogs.com/zuoxiaolong/p/pattern11.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值