首页 > 其他分享 >装饰者模式

装饰者模式

时间:2023-08-06 16:01:52浏览次数:36  
标签:cost 模式 public Beverage Override return 装饰 beverage

装饰者模式

**装饰者模式:**动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

*设计原则:*类应该对扩展开放,对修改关闭

继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式。

在我们的设计中,应该允许行为可以被扩展,而无须修改现有的代码。

组合和委托可用在运行时动态地加上新的行为。

除了继承,装饰者模式也可以让我们扩展行为。

装饰者模式意味着一群装饰者类,这些类用来包装具体组件。

装饰者类反映着出被装饰的组件类型(事实上,他们具有相同的类型,都经过接口或继承实现)。

装饰者可以在被装饰者的行为前面(与/或)后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的。

你可以用无数个装饰者包装一个组件。

装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型。

装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得很复杂。

package HeadFirstDesignMode.decorator;

/**
 * 描述:
 * Created by zjw on 2018-11-04 19:58
 */
public class StartBuckCoffee {

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

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

        Beverage beverage2 = new HouseBlend();
        beverage2 = new Soy(beverage2);
        beverage2 = new Mocha(beverage2);
        beverage2 = new Whip(beverage2);
        System.out.println(beverage2.getDescription() + " $" + beverage2.cost());
    }

    // 饮料杯型、描述、成本
    static abstract class Beverage {
        // 小杯,中杯,大杯
        public static int TALL = 1, GRANDE = 2, VENTI = 3;
        public String description = "Unknown Beverage";
        public int size = 0;

        public String getDescription() {
            return description;
        }

        public int getSize() {
            return size;
        }

        //成本
        public abstract double cost();
    }

    //装饰器
    static abstract class CondimentDecorator extends Beverage {
        public abstract String getDescription();

        public abstract int getSize();
    }

    static class DarkRoast extends Beverage {

        public DarkRoast() {
            description = "Dark Roast";
        }

        @Override
        public double cost() {
            return 0.78;
        }
    }

    static class Espresso extends Beverage {

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


        @Override
        public double cost() {
            return 1.99;
        }
    }

    static class HouseBlend extends Beverage {

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

        @Override
        public double cost() {
            return 0.89;
        }
    }

    static class Mocha extends CondimentDecorator {

        Beverage beverage;

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

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

        @Override
        public int getSize() {
            return beverage.getSize();
        }

        @Override
        public double cost() {
            double cost = beverage.cost();
            if (getSize() == Beverage.TALL) {
                cost += 0.1;
            } else if (getSize() == Beverage.GRANDE) {
                cost += 0.15;
            } else if (getSize() == Beverage.VENTI) {
                cost += 0.20;
            }
            return cost;
        }
    }

    static class Soy extends CondimentDecorator {

        Beverage beverage;

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

        @Override
        public String getDescription() {
            return beverage.getDescription() + ", Soy";
        }

        @Override
        public int getSize() {
            return beverage.getSize();
        }

        @Override
        public double cost() {
            return 0.55 + beverage.cost();
        }
    }

    static class Whip extends CondimentDecorator {

        Beverage beverage;

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

        @Override
        public String getDescription() {
            return beverage.getDescription() + ",Whip";
        }

        @Override
        public int getSize() {
            return beverage.getSize();
        }

        @Override
        public double cost() {
            return 0.88 + beverage.cost();
        }
    }
}

标签:cost,模式,public,Beverage,Override,return,装饰,beverage
From: https://blog.51cto.com/u_11906056/6984947

相关文章

  • 工厂方法模式
    工厂方法模式**工厂方法模式:**定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。设计原则:依赖倒置原则:要依赖抽象,不要依赖具体类。下面的指导方针,能避免在OO设计原则中违反依赖倒置原则:变量不可以持有具体的类的引用。不要让......
  • 【Java】智慧工地管理系统源码(SaaS模式)
    智慧工地是聚焦工程施工现场,紧紧围绕人、机、料、法、环等关键要素,综合运用物联网、云计算、大数据、移动计算和智能设备等软硬件信息技术,与施工生产过程相融合。一、什么是智慧工地智慧工地是指利用移动互联、物联网、智能算法、地理信息系统、大数据挖掘分析等信息技术,提高项目......
  • openGauss学习笔记-32 openGauss 高级数据管理-批处理模式
    openGauss学习笔记-32openGauss高级数据管理-批处理模式openGauss支持从文本文件执行SQL语句。openGauss提供了gsql工具实现SQL语句的批量处理。以下场景建议使用批处理:如果您重复运行查询(例如,每天或每周),将其设为脚本可以让您避免每次进行重复输入。您可以通过复制和编辑脚......
  • 内蒙古草原装饰不锈钢精神堡垒厂家报价
    内蒙古草原装饰不锈钢精神堡垒厂家报价内蒙古草原装饰不锈钢精神堡垒的产品除了具有观赏性之外,更重要的是其承载了一种精神内涵。每一件雕塑都带有某种特定的寓意和象征意义,代表着一种信念和追求。这些雕塑在不同的场合中起到了重要的作用,激发人们的激情和动力,激励他们在人生道路上......
  • C++工厂模式简易实现
    C++工厂模式简易实现引言:动态绑定是面向对象编程的重要功能,但C++目前还没有纳入标准库的反射机制,所以为了更方便的动态构造对象,使得通过配置文件的方式改变派生类对象,而不需要去修改代码,所以可以使用工厂这一常见的设计模式,来完成类对象的动态构造。基于C++11的新特性和模板,实现......
  • C#中CLR核心机制解析:垃圾回收与标准Dispose模式
    一、CLR核心机制1.1-创建对象的流程分配内存把对象传入到构造函数构造函数使用当前实例返回1.2-什么是堆/栈?堆-Heap:托管堆;一个程序运行时,该进程存放引用类型变量的一块内存,他是全局唯一的。栈-Stack:先进后出数据结构,线程栈;每一个线程存放变量和值类型的内存,随着线程......
  • day 122 - bean的作用域,生命周期,工厂模式
    bean的作用域在Spring中可以通过配置bean标签的scope属性来指定bean的作用域范围singleton(默认)在IOC容器中,这个bean的对象始终为单实例在ioc容器初始化时创建对象prototype这个bean在IOC容器中有多个实例在获取bean时创建对象<!--scope设置bean的作用域:......
  • k8s部署DataEase1.16.0cluster模式
    1.下载官方helm  chart包下载地址:https://github.com/mfanoffice/dataease-helm/releases,当前最新为1.16.0#下载并解压helmchart包wgethttps://github.com/mfanoffice/dataease-helm/releases/download/1.16.0/dataease-1.16.0.tgztarxfdataease-1.16.0.tgzcddataease......
  • 转变税务管理模式,实现“四精”
        中共中央办公厅、国务院办公厅前不久印发了《关于进一步深化税收征管改革的意见》(以下简称《意见》),对深入推进“四精”即精确执法、精细服务、精准监管、精诚共治,深化税收征管改革作出了全面部署,为“十四五”时期税收工作确立了总体规划。科技的发展为税收征管现代化提......
  • 迭代器模式-18
    概述迭代器模式(IteratorPattern)又称游标(Cursor)。它提供了一种方式访问聚合对象中的元素而不用暴露这个对象的内部表示。优点:符合“单一职责原则”、“开闭原则”。缺点:增加系统复杂度。interfaceIterator{voidfirst();voidnext();booleanhasNext();O......