设计模式工作生活

设计模式:装饰者模式

2019-07-04  本文已影响213人  末日声箫

一 场景

在开发中,有时候的需求会要求我们在某个对象原有的基础上添加一些属性或者行为,这时候我们可以考虑直接在类里面添加(违背类开-闭原则),或者通过继成添加(如果多次就需要添加多个类,维护起来很困难),这时候就可以考虑使用装饰者模式。

二 定义

装饰者模式概念:
动态的给对象添加一些额外的属性或行为。相比于使用继承,装饰者模式更加灵活。
装饰者模式核心模块:

三 实例

我们给一个甜品店做一个订单系统
一共两种商品:蛋糕 ,面包
可在这四种蛋糕的基础上添加各种水果:香蕉,草莓
添加其它装饰:奶油
uml类图:

Decorator.png
代码 :
GoodsComponent 这是一个抽象构件,他定义了具体的构件对象
package headFirst.decoratorPattern;

/**
 * @author zhaokai008@ke.com
 * @date 2019-07-03 23:57
 */
public interface GoodsComponent {
    double cost();
    String getDescription();
}

CakeConcreteComponent 这是一个cake的定义具体的构件对象

package headFirst.decoratorPattern;

/**
 * @author zhaokai008@ke.com
 * @date 2019-07-04 00:00
 */
public class CakeConcreteComponent implements GoodsComponent {
    public double cost() {
        return 10;
    }

    public String getDescription() {
        return "cake";
    }
}

BreadConcreteComponent:这是一个Bread的定义具体的构件对象

package headFirst.decoratorPattern;

/**
 * @author zhaokai008@ke.com
 * @date 2019-07-04 00:04
 */
public class BreadConcreteComponent implements GoodsComponent {
    public double cost() {
        return 5;
    }

    public String getDescription() {
        return "bread";
    }
}

Decorator:抽象装饰类,新加了个unitPrice 单价的装饰方法

package headFirst.decoratorPattern;

/**
 * @author zhaokai008@ke.com
 * @date 2019-07-04 00:08
 */
public abstract class Decorator implements GoodsComponent {

    public abstract double cost() ;

    public abstract String getDescription() ;

    public abstract  double  unitPrice();
}

MilkDecorator:具体装饰类

package headFirst.decoratorPattern;

/**
 * @author zhaokai008@ke.com
 * @date 2019-07-04 00:12
 */
public class MilkDecorator extends Decorator {
    public MilkDecorator(GoodsComponent goodsComponent) {
        this.goodsComponent = goodsComponent;
    }

    private GoodsComponent goodsComponent;

    public double cost() {
        return goodsComponent.cost() + 10;
    }

    public String getDescription() {
        return goodsComponent.getDescription() + " add milk";
    }

    public double unitPrice() {
        return 10;
    }
}

StrawberryDecorator:具体装饰类

package headFirst.decoratorPattern;

/**
 * @author zhaokai008@ke.com
 * @date 2019-07-04 00:11
 */
public class StrawberryDecorator extends Decorator {
    private GoodsComponent goodsComponent;

    public StrawberryDecorator(GoodsComponent goodsComponent) {
        this.goodsComponent = goodsComponent;
    }

    public double cost() {
        return goodsComponent.cost() + 15;
    }

    public String getDescription() {
        return getDescription() + " add Strawberry";
    }

    public double unitPrice() {
        return 15;
    }
}

BananaDecorator:具体装饰类

package headFirst.decoratorPattern;

/**
 * @author zhaokai008@ke.com
 * @date 2019-07-04 00:06
 */
public class BananaDecorator extends Decorator {
     GoodsComponent goodsComponent;

    public BananaDecorator(GoodsComponent goodsComponent) {
        this.goodsComponent = goodsComponent;
    }

    public double cost() {
        return goodsComponent.cost() + 12;
    }

    public String getDescription() {
        return goodsComponent.getDescription() + " add Banana";
    }

    public double unitPrice() {
        return 12;
    }
}

test:测试类,加两根香蕉和奶油的蛋糕多少钱

package headFirst.decoratorPattern;

/**
 * @author zhaokai008@ke.com
 * @date 2019-07-04 00:24
 */
public class Test {
    public static  void main(String  [] args){
        GoodsComponent goodsComponent = new CakeConcreteComponent();
        goodsComponent = new BananaDecorator(goodsComponent);
        goodsComponent = new BananaDecorator(goodsComponent);
        goodsComponent = new MilkDecorator(goodsComponent);

        System.out.println(goodsComponent.getDescription() + "cost: " +goodsComponent.cost());
    }

}

//--------------input
cake add Banana add Banana add milkcost: 44.0

四 总结

相信从上面大家也能看出装饰者模式的一些优缺点:
优点

上一篇 下一篇

猜你喜欢

热点阅读