装饰器模式

装饰器模式

什么是装饰器模式:

是一种结构型设计模型,允许在不改变对象结构的情况下,动态的将新的功能添加到对象上,

核心思想:

通过组合而非继承的方式来实现功能扩展。他可以在运行时动态的添加活移除对象的功能,而无需修改原始对象的代码。

解决的问题:

继承关系过于复杂的问题,通过组合来代替继承。

使用场景:

用于扩展一个类的功能,或者给一个类添加附加职责
动态的给一个对象添加功能,这些功能可以动态的被撤销
需要为一批平行的兄弟类进行改造或者加装功能

案例:为咖啡添加作料

咖啡接口

package Decorator;

/**
 * 抽象咖啡类
 */
public interface Coffee {

    double getCost();

    String getDescription();
}

装饰器抽象类

package Decorator;

/**
 * 装饰器抽象类
 */
public abstract class CoffeeDecorator implements Coffee {

    //静态代理
    /**
     * 静态代理:
     * 创建目标  创建代理对象  将目标传给代理对象
     */
    protected final Coffee decoratorCoffee;

    public CoffeeDecorator(Coffee decoratorCoffee) {
        this.decoratorCoffee = decoratorCoffee;
    }

    @Override
    public double getCost() {
        return decoratorCoffee.getCost();
    }

    @Override
    public String getDescription() {
        return decoratorCoffee.getDescription();
    }
}

普通咖啡类:

package Decorator;

/**
 * 基础咖啡类
 */
public class SimpleCoffee implements Coffee{
    @Override
    public double getCost() {
        return 1.0;
    }

    @Override
    public String getDescription() {
        return "Simple coffee";
    }
}

牛奶装饰器类

package Decorator;

/**
 * 牛奶装饰器
 */
public class MilkDecorator extends CoffeeDecorator {

    public MilkDecorator(Coffee decoratorCoffee) {
        super(decoratorCoffee);
    }

    @Override
    public double getCost() {
        return super.getCost() + 0.5;
    }

    @Override
    public String getDescription() {
        return super.getDescription() + "with milk";
    }

}

糖浆装饰器类

package Decorator;

/**
 * 糖浆装饰器
 */
public class SyrupDecorator extends CoffeeDecorator{

    public SyrupDecorator(Coffee decoratorCoffee) {
        super(decoratorCoffee);
    }

    @Override
    public double getCost() {
        return super.getCost() + 1;
    }

    @Override
    public String getDescription() {
        return super.getDescription() + "with 糖浆";
    }

}

测试类:

package Decorator;

public class Client {

    public static void main(String[] args) {

        //基本咖啡
        Coffee simpleCoffee = new SimpleCoffee();
        System.out.println("simpleCoffee" + simpleCoffee.getDescription() + ",cost:" + simpleCoffee.getCost());

        //咖啡 + 牛奶
        Coffee milkCoffee = new MilkDecorator(simpleCoffee);
        System.out.println("milkCoffee:" + milkCoffee.getDescription() + ",cost:" + milkCoffee.getCost());

        //咖啡 + 牛奶 + 糖
        Coffee syrupCoffee = new SyrupDecorator(milkCoffee);
        System.out.println("syrupCoffee + milkCoffee:" + syrupCoffee.getDescription() + ",cost:" + syrupCoffee.getCost());

    }

}

在这里插入图片描述
项目地址: https://gitee.com/htzGittee/design-patterns/tree/master/designPatterns

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值