Head First设计模式-装饰者模式

本文介绍装饰者模式的应用场景及其实现方式,通过示例代码展示了如何动态为对象添加职责,而不使用子类实现。适用于希望扩展功能又不想修改现有代码的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、整体代码

        Beverage.java

public abstract class Beverage {
        String description = "Unknown Beverage";

        public String getDescription() {
                return description;
        }

        public abstract double cost();
}

       CondimentDecorator.java

public abstract class CondimentDecorator extends Beverage {
        public abstract String getDescription();
}

        Espresso.java

public class Espresso extends Beverage {

        public Espresso() {
                description = "Espresso";
        }

        public double cost() {
                return 1.99;
        }
}

        HouseBlend.java 

public class HouseBlend extends Beverage {
        public HouseBlend() {
                description = "House Blend Coffee";
        }

        public double cost() {
                return .89;
        }
}

        Mocha.java 

public class Mocha extends CondimentDecorator {
        Beverage beverage;

        public Mocha(Beverage beverage) {
                this.beverage = beverage;
        }

        public String getDescription() {
                return beverage.getDescription() + ", Mocha";
        }

        public double cost() {
                return .20 + beverage.cost();
        }
}

        StarbuzzCoffee.java 

public class StarbuzzCoffee {

        public static void main(String args[]) {
                Beverage beverage = new Espresso();
                System.out.println(beverage.getDescription()
                                + " $" + beverage.cost());

                beverage = new Mocha(beverage);
                System.out.println(beverage.getDescription()
                                + " $" + beverage.cost());

                Beverage beverage1 = new HouseBlend();
                System.out.println(beverage1.getDescription()
                                + " $" + beverage1.cost());

                beverage1 = new Mocha(beverage1);
                System.out.println(beverage1.getDescription()
                                + " $" + beverage1.cost());
        }
}


 二、结构图




三、运行结果



四、解释

        1、什么时候用装饰者模式

        当需要在类上增加功能时,如果采用继承导致类爆炸,可以选择用装饰者模式来增加类的功能。

        动态地将责任附加到对象上。要想扩展功能,装饰者模式提供了有别继承的另一个种选择。

        2、无轮是装饰者还是被装饰者都要继承同一个父类。

        3、OO原则

        对扩展开放,对修改关闭:就是增加新功能,最好扩展已有的类,不要修改已有类中的代码。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值