您的位置:首页 > 其它

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

2017-01-02 18:01 344 查看
声明:文章内容根据大牛博客的内容,自己理解后,给自己做的学习笔记,文末会附上大牛博客地址链接。有需要沟通交流的可加我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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: