声明:文章内容根据大牛博客的内容,自己理解后,给自己做的学习笔记,文末会附上大牛博客地址链接。有需要沟通交流的可加我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