龙空技术网

阿瑟Java (37):装饰者模式

阿瑟杰克斯 14

前言:

当前同学们对“递归算法例题汽水问题递归”可能比较关怀,各位老铁们都想要了解一些“递归算法例题汽水问题递归”的相关文章。那么小编同时在网上网罗了一些对于“递归算法例题汽水问题递归””的相关内容,希望姐妹们能喜欢,大家快快来学习一下吧!

PS:创作不易,感谢阅读,希望对读者有所帮助,喜欢的话可以点赞、收藏、关注,作者会持续更新 Java 生态圈常见知识。黑色加粗为重点关注内容!

基本描述动态的给一个对象添加一些额外的功能就增加功能来说,装饰器模式相比生成子类更为灵活。主要解决为了扩展一个类经常使用继承方式实现,由于继承会为类引入静态特征,并且随着扩展的增多,子类会很膨胀。何时使用在不想增加很多子类的情况下扩展类。如何解决将具体功能职责划分,同时继承装饰者模式。优点装饰类和被装饰类可以独立发展,不会相互耦合装饰者模式是继承的一个替代,可以动态扩展一个类的功能。缺点多层装饰比较复杂实现Component 类充当抽象角色,不应该具体实现。修饰类引用和继承 Component 类,具体扩展类重写父类方法。定义一个装饰的【主体接口】创建一个被装饰类,并实现了【主体接口】创建一个装饰类的抽象类,实现了【主体接口】,并实现多种【装饰类】使用时,创建【被装饰类】的对象,并传入【装饰类】中进行扩展由于【被装饰类】和【装饰类】都实现了同样的接口,所以可以用递归的方式来进行装饰使用场景扩展一个类的功能动态增加功能,动态撤销角色Component:装饰的主体,抽象的超类ConcreteComponent: 被装饰的对象,继承ComponentDecorator: 装饰者类共同实现的接口或抽象类, 继承Component,并且持有一个被装饰对象的引用。代码示例

咖啡实例:对某一种咖啡添加不同的调料

定义装饰的主体接口

public abstract class Beverage {    String description = "Unknown Beverage";    public String getDescription() {        return description;    }    /* cost方法是用来返回饮料的价钱(需在具体类中自己实现)*/    public abstract BigDecimal cost();}
定义一个被装饰者的饮料对象
/* 深焙咖啡类(一种具体的饮料)*/public class DarkRoast extends Beverage {    /* 说明他是DarkRoast饮料 */    public DarkRoast() {        description = "DarkRoast";    }    /* 实现cost方法,用来返回DarkRoast(深焙咖啡)的价格 */    @Override    public BigDecimal cost() {        return new BigDecimal("3.00");    }}
定义一个调料装饰者类的抽象类,并实现两种装饰者类
/* @description 调料装饰着抽象类(继承自饮料抽象类)*/public abstract class CondimentDecorator extends Beverage {    /**     * 所有的调料装饰者都必须重新实现getDescription()方法     * 这样才能够用递归的方式来得到所选饮料的整体描述     */    public abstract String getDescription();}
摩卡调料类
/* 摩卡调料类(继承自CondimentDecorator)*/public class Mocha extends CondimentDecorator {    /* 引入被装饰者的饮料实例变量 */    Beverage beverage;    /* 构造器初始化饮料变量 */    public Mocha(Beverage beverage) {        this.beverage = beverage;    }    /* 在原来饮料的基础上添加上Mocha描述(原来的饮料加入Mocha调料,被Mocha调料装饰)*/    @Override    public String getDescription() {        return beverage.getDescription() + ",Mocha";    }    /* 在原来饮料的基础上加上Mocha的价格(原来的饮料加入Mocha调料,被Mocha调料装饰)*/    @Override    public BigDecimal cost() {        return new BigDecimal("0.2").add(beverage.cost());    }}
豆浆调料类
/* 豆浆调料类(继承自CondimentDecorator)*/public class Soy extends CondimentDecorator {    /* 引入被装饰者的饮料实例变量 */    Beverage beverage;    /* 构造器初始化饮料变量 */    public Mocha(Beverage beverage) {        this.beverage = beverage;    }    /* 在原来饮料的基础上添加上Soy描述(原来的饮料加入Mocha调料,被Mocha调料装饰)*/    @Override    public String getDescription() {        return beverage.getDescription() + ",Soy";    }    /* 在原来饮料的基础上加上Soy的价格(原来的饮料加Soy调料,被Soy调料装饰)*/    @Override    public BigDecimal cost() {        return new BigDecimal("0.3").add(beverage.cost());    }}
使用示例,模拟咖啡制作
/* 咖啡制作 */public class StarbuzzCoffee {    public static void main(String[] args) {        //订一杯深焙咖啡类(3.00),不需要调料,打印出它的描述与价钱。        Beverage beverage = new DarkRoast();        System.out.println("Description: " + beverage.getDescription() + " $" + beverage.cost());        //制造出一个深焙咖啡类(3.00)对象,用摩卡(0.2)装饰它,用第二个摩卡(0.2)装饰它,用豆浆(0.3)装饰它,打印出它的描述与价钱。        Beverage beverage2 = new DarkRoast();        beverage2 = new Mocha(beverage2);        beverage2 = new Mocha(beverage2);        beverage2 = new Soy(beverage2);        System.out.println("Description: " + beverage2.getDescription() + " $" + beverage2.cost());    }}

标签: #递归算法例题汽水问题递归