栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

设计模式--装饰模式--案例分析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式--装饰模式--案例分析

介绍
    概述:装饰模式是一种对象结构型模型,动态地给一个对象增加一些额外的职责。就扩展功能而言,装饰模式提供了一种比使用子类对象更加灵活的替代方案实现:4个角色
    (1)Component(抽象构件):
    (2)ConcreteComponent(具体构件)
    (3)Decorator(抽象装饰类)
    (4)ConcreteDecorator(具体装饰类)
案例

实例说明:某咖啡店在卖咖啡时可以根据顾客的要求在其中加入各种配料,咖啡店会根据所加入的配料来计算总费用。现使用装饰模式为该咖啡店设计一个程序以实现计算费用的功能,输出每种饮料的详细描述及花费。

类图

实现 抽象构件Beverage类:
package com.design.DecoratorMode;

public abstract class Beverage {
    public abstract String getDescription();

    public abstract double getCost();
}

具体构建类Espresso
package com.design.DecoratorMode;

public class Espresso extends Beverage{
    @Override
    public String getDescription() {
        return "Espresso 咖啡";
    }

    @Override
    public double getCost() {
        return 25;
    }
}
抽象装饰类CondimentDecorator
package com.design.DecoratorMode;

public class CondimentDecorator extends Beverage{
    private Beverage beverage;

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

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

    @Override
    public double getCost() {
        return beverage.getCost();
    }
}
具体装饰类Milk与Mocha:
package com.design.DecoratorMode;

public class Milk extends CondimentDecorator{

    public Milk(Beverage beverage) {
        super(beverage);
    }

    public String getDescription(){
        return super.getDescription() + this.addMilk();
    }

    public double getCost(){
        return super.getCost()+this.addMilkCost();
    }

//    新增业务方法
    public String addMilk(){
        return "加牛奶";
    }

    public double addMilkCost(){
        return 6;
    }
}
package com.design.DecoratorMode;

public class Mocha extends CondimentDecorator{
    public Mocha(Beverage beverage) {
        super(beverage);
    }

    public String getDescription(){
        return super.getDescription() + this.addMocha();
    }

    public double getCost(){
        return super.getCost() + this.addMochaCost();
    }

    private double addMochaCost() {
        return 10;
    }

    private String addMocha() {
        return "加摩卡";
    }
}
测试类StarBuzzCoffee
package com.design.DecoratorMode;


public class StarBuzzCoffee {
    public static void main(String[] args) {
        Beverage b1, b2, b3;

        b1 = new Espresso();
//        这里交给大家补充一个HouseBlend类
//        b1 = new HouseBlend();
        System.out.println("饮料:" + b1.getDescription());
        System.out.println("价格:" + b1.getCost());
        System.out.println("----------------------------");


        b2 = new Milk(b1);
        System.out.println("饮料:" + b2.getDescription());
        System.out.println("价格:" + b2.getCost());
        System.out.println("----------------------------");

        b3 = new Mocha(b2);
        System.out.println("饮料:" + b3.getDescription());
        System.out.println("价格:" + b3.getCost());
        System.out.println("----------------------------");
    }
}

结果

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/785998.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号