在装饰器模式中添加状态

2023-12-08

我想知道如何向消费者可用的装饰器链添加状态。鉴于这个简化模型:

abstract class AbstractPizza 
{
    public abstract print(...);
}

class Pizza : AbstractPizza 
{
    public int Size { get; set; }
    public print(...);
}

abstract class AbstractPizzaDecorator 
{
    public Pizza:AbstractPizza;
    public abstract print();
}

class HotPizzaDecorator : AbstractPizzaDecorator 
{
    public int Hotness { get; set; }
    public print(...);
}

class CheesyPizzaDecorator : AbstractPizzaDecorator 
{
    public string Cheese { get; set; }
    public print(...);
}


void Main()
{
    BigPizza = new Pizza();
    BigPizza.Size = 36;

    HotBigPizza = new HotPizzaDecorator();
    HotBigPizza.Pizza = BigPizza;
    HotBigPizza.Hotness = 3;

    HotBigCheesyPizza = new CheesyPizzaDecorator();
    HotBigCheesyPizza.Pizza = HotBigPizza;
    HotBigCheesyPizza.Cheese = "Blue";

    HotBigCheesyPizza.print();
    HotBigCheesyPizza.size = 28; // ERRRRRR !
}

现在,如果它们都实现 print 方法并通过链传播该方法,那么一切都很好。但这对国家来说如何运作呢?我无法访问 HotBigCheesyPizza 上的大小属性。

我缺少什么部分?图案错误?

感谢您的帮助! 干杯


装饰器模式用于向被装饰类添加额外的行为,而无需客户端进行调整。因此,它并不是为了添加新接口(例如hotness, cheese)到被装饰的东西。

一个不太好的例子是你想改变它的用途size计算得出:您可以创建一个MetricSizePizzaDecorator将尺寸与英制/公制单位相互转换。客户不会知道披萨已经装饰过——它只是调用getSize()并对结果执行任何需要执行的操作(例如,计算价格)。

我可能不会在我的示例中使用装饰器,但要点是:它不会改变界面。事实上,几乎所有的设计模式都可以归结为这一点——在不改变界面的情况下增加设计的可变性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在装饰器模式中添加状态 的相关文章

  • 与竞争的消费者顺序处理消息

    Problem 我以特定顺序 FIFO 在队列上接收消息 比如订单 我的队列中有竞争的消费者 为了进一步增加复杂性 消费者可能只对订单的特定版本感兴趣 具体取决于其状态 例如版本 1 版本 2 和版本 5 订单版本号在订单上可用 但不能用于
  • 业务代表与服务定位器

    Business Delegate 和 Service Locator 之间有什么区别 两者都负责封装查找和创建机制 如果 Business Delegate 使用 Service Locator 来隐藏查找和创建机制 那么 Busines
  • Python - 装饰器 - 尝试访问方法的父类

    这不起作用 def register method name None def decorator method The next line assumes the decorated method is bound which of co
  • 在 C++ 中创建观察者设计模式的好方法

    我正在尝试用 C 实现观察者设计模式 如下所示 include
  • 三层 Asp.Net 应用程序中的异常处理

    1 据我了解 在three tierAsp Net应用程序我们应该通过以下方式实现异常处理 a 我们应该把try catch围绕代码块 位于三层中的任何一层 我们希望页面能够从该代码块正常恢复 当此代码生成异常时 b 我们不应该放try c
  • C 中的 N 依赖注入 - 比链接器定义的数组更好的方法?

    Given a 库模块 在下文中称为Runner 它作为可重复使用的组件 无需重新编译 即静态链接库 中应用程序分区架构的 而不是主分区 请注意 它仅包含main 出于演示目的 Given a set 顺序无关 调用的其他模块 对象Call
  • 两个对象相互依赖。那不好吗?

    当我为我的项目构建自己的系统时 我学到了很多关于设计模式的知识 我想问你一个我找不到答案的设计问题 目前我正在使用套接字构建一个带有多个客户端的小型聊天服务器 现在我有三门课 人级其中包含昵称 年龄和房间对象等信息 房间级它保存诸如房间名称
  • NHibernate 中具有不同类型答案的问题

    我正在尝试找到一个问卷问题的简洁解决方案 假设我有一个Questionnaire类有一个集合Answers e g public class Questionnaire public virtual ISet
  • Joshua Bloch 的构建器设计模式有何改进?

    早在 2007 年 我就读过一篇关于 Joshua Blochs 所采用的 构建器模式 的文章 以及如何修改它以改善构造函数和 setter 的过度使用 特别是当对象具有大量属性 其中大部分属性是可选的 时 本文对此设计模式进行了简要总结
  • 类是否应该有静态和非静态成员

    我试图找出一个类何时适合同时具有静态和非静态函数 又名 obj new ClassA obj gt doOOPStuff something ClassA doStaticStuff Note This example is done in
  • 检查一个类是否是另一个类的子类

    我想在不创建实例的情况下检查一个类是否是另一个类的子类 我有一个类 它接收类名作为参数 作为验证过程的一部分 我想检查它是否属于特定的类系列 以防止安全问题等 有什么好的方法可以做到这一点吗 is subclass of http php
  • Delphi:写入后代类中私有祖先的字段

    我需要修复第三方组件 该组件的类具有私有变量 该变量由其后代主动使用 TThirdPartyComponentBase class private FSomeVar Integer public end TThirdPartyCompone
  • 一个类应该验证自身还是创建另一个类来验证它?

    假设我有一堂课 class NavigationData float roll float pitch double latitude double longitude 如果我想创建一个方法 const bool validate cons
  • R参考类问题

    我正在尝试在 R 中创建一个简单的参考类 这是我的代码 R 初学者 MyClass lt setRefClass MyClass fields list a numeric b numeric methods list initialize
  • 多重继承争论 II:根据 Stroustrup 的说法 [已关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我非常了解关于为什么接口继承优于多重继承的传统争论 这里已经有一篇文章 C 应该有多重继承吗 https stackoverflow com q
  • 单例属性

    好吧 如果我创建一个单例类并通过公共静态属性公开单例对象 我明白了 但我的单例类还有其他属性 这些应该是静态的吗 这些也应该是私人的吗 我只想通过执行以下操作来访问单例类的所有属性 MySingletonClass SingletonPro
  • 为什么抽象类应该实现抽象基类的抽象方法?

    在下面的示例中 该类Derived实现抽象方法method从课堂上Main 但我想不出在抽象中填写方法体的理由Derived类的实现 当然 我应该只在实际类中实现抽象方法 那么我怎样才能避免这样做呢 我还可以做些什么 abstract cl
  • 防止Java实例化的正确方法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何决定使用 IS A 还是 HAS A Relation

    public class B public String getMe return Some 假设我有一个上面的类 我们应该通过哪些参数来决定使用什么 是否是一个或有一个关系 HAS A public class A public stat
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No

随机推荐

  • 打字稿条件:backend_layout(带幻灯片)

    我用这个条件 globalVar GP colPos 0 page backend layout pagets MainTemplate 我的问题是我的 子页面 没有选择 backend layout 因为设置了父页面 后端布局 此页面的子
  • C函数内存分配

    在 C 语言中 函数何时分配以及它在内存中的何处 函数的内存是在第一次编译程序时分配的 还是在第一次看到函数调用时分配的 它是分配在堆栈上还是在代码段中 你的问题问得很好 但是要做好应对一些额外复杂性的准备 因为其中一些东西会接触到运行代码
  • 使用 AutoHotKey 查找并填写输入字段

    对所有 AutoHotKey 大师的挑战 给我们一个函数查找并移动光标到输入字段 例如登录名 或者发送输入文本 对于像我这样又老又懒的黑客来说 只是摆弄 AHK 它看起来像这样 FindFillField elementid sendtex
  • Javascript Array.some() 和 Array.every() 相当于 Set?

    在 JavaScript 中 是否有等价的Array some and Array every 为了Set内置对象 不 唯一的内置方法Set prototype are Set prototype add Set prototype cle
  • 从 &str 数组获取 Iterator

    我正在尝试抽象一个函数来获取两个实例std str Lines以及用于测试目的的模拟版本 由一系列创建 str 我的代码 确实有效 看起来像这样 use std fs test fn test day 1 let v 3 3 4 2 4 i
  • 如何解决“Newtonsoft.Json.JsonSerializationException无法找到用于类型的构造函数”Android错误?

    我正在使用 Unity3D 开发应用程序 我将我自己的实用程序 DLL 与一些类一起使用 我已经工作了几个月了 并且毫无问题地进行了很多构建 编译 上周向 DLL 添加了一个新类 它在我的 PC 中运行良好 但当我构建该项目并在我的 And
  • Pymunk 伺服关节

    如何在 Pymunk 中实现 伺服 关节 我正在尝试创建一个简单的模型 其中一个盒子在其下方的一条细 腿 上保持平衡 我已经能够创建一个盒子并使用PinJoint 但似乎没有任何方法可以控制连接连接到盒子的角度 我希望能够指定附着角度 其他
  • 在 scons 'Program' 命令中使用 'LIBS' 找不到静态库,为什么?

    我有一个 n c 作为主函数 o c 作为导入函数 如下所示 cat n c o c int f int main f return 0 include
  • 将节点附加到现有的 xml-Java

    我已经看到 vb 和 c 回答了同样的问题 但我需要一个 Java 最佳解决方案来将节点附加到 xml xpath 有帮助吗 我有 a b b a
  • 在 Ember.CollectionView 渲染结束时运行 jquery

    我有一个容器视图其中包含一个集合视图 在这之后集合视图呈现在屏幕上我需要执行jquery函数它本质上是查看渲染模板的内容并执行一些显示修改 如果我在插入元素 of 集合视图它可以工作 但它会针对中的每个元素执行集合视图因为我真的只需要在最后
  • 如何在气泡图中的 ggplot 2 中设置 geom_vline 和 geom_hline 的背景

    我想在气泡图上添加一条垂直线和一条水平线 而不过度绘制气泡 数据来了 a lt c np prepp vp animal artifact communication ipv isv b lt c 0 51 0 32 0 85 0 61 0
  • 正则表达式意外结束

    我只想从路径中获取带有扩展名的文件名 C Users anandada workspace MyTestProject src OpenTest c 以下声明 fileName re match c fileName 给出错误 正则表达式意
  • React.addons.createFragment 对象中元素的顺序

    我正在读https facebook github io react docs create fragment html文章中发现 FB 工程师依赖于对象内存布局 属性的顺序 if this props swapped children R
  • 如何在codeigniter中获取具有特定id的最后一条记录

    我这里有 2 张桌子 第一个是customer其次是会员资格 现在我只想得到一个特定的最后一条记录customer id从这些联合表 客户和会员 中 这是我的客户表结构 这是我的成员资格表结构和所需的最新插入行 这里我自己尝试了一个代码 r
  • 在Web浏览器中查找并单击html代码中没有ID的按钮

    我基本上有一个网络浏览器控件 它正在浏览并自动完成一些表单 到目前为止 这很容易 但是我已经得到了一个没有标有 ID 或 提交 或 重置 按钮的表单姓名 我需要能够同时单击两者 示例 提交按钮 td align right valign m
  • iCloud 是否需要在生产环境中才能在生产中使用?

    I added Cloudkit support to my iOS and WatchOS App but I cannot deploy my schema to production due to a bug Do I need to
  • javascript:从回调函数调用对象内部的函数

    当我尝试使用回调函数中的 this 调用对象内部的函数时 会发生错误 指出该方法未定义 我该如何解决这个问题 var object log user pass error message an error occured while con
  • 密码正则表达式必须包含至少 8 个字符,至少 1 个数字、字母和特殊字符

    我需要一个正则表达式 它应该至少有一个数字字符 允许大写和小写字母 也允许特殊字符我正在使用这个表达式 6 10 d a zA Z 但对于最大字符数 10 无效 看来你想要这样的东西 d a zA Z W 6 10 上述正则表达式仅允许 6
  • 选择数据库类型[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 何时使用 bigtabe simpledb 数据库与关系数据库 关系数据库为您提供了更多的布局和查询灵活性 并且更易于使用 但是如果您以后需要对数据进行分区 如果它不适合单个数据
  • 在装饰器模式中添加状态

    我想知道如何向消费者可用的装饰器链添加状态 鉴于这个简化模型 abstract class AbstractPizza public abstract print class Pizza AbstractPizza public int S