- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想制作一个程序来执行饮料订单输入系统。 (我可能会做描述,费用)
我想使用装饰者模式和观察者模式。我画了一张UML图,保存为图片方便查看。该站点不允许我以 word 文档形式上传,因此我必须上传图片 - 我希望它易于查看....
在继续编码部分之前,我需要知道我是否正确地执行了 UML/设计模式。
饮料是我的抽象组件类。Espresso、houseblend、darkroast 是我的具体主题类(class)..
我还有一个调味品装饰类牛奶,摩卡咖啡,大 bean ,鞭子。会是我的观察员吗?因为他们会对成本的数据更改感兴趣?
现在,espresso、houseblend 等会成为我的主题,而调味品会成为我的观察者吗?我的理论是,Cost 是一种变化,调味品需要知道这种变化吗?
所以,subject = esspresso,houseblend,darkroast,etc..//他们持有 cost()
Observer = 牛奶、摩卡咖啡、大 bean 、鞭子?//他们持有 cost()
将是具体的组件和牛奶,摩卡咖啡,大 bean ,鞭子?将是装饰者!
因此,遵循良好的软件工程实践“针对接口(interface)而不是实现进行设计”或“识别那些没有变化的事物”
我需要一个 costbehavior 接口(interface)吗?
如果你看一下 UML,你就会明白我要用它做什么,看看我是否正确地实现了观察者 + 装饰器模式?我认为装饰器是正确的。
由于图片不太清晰,我将在此处详细介绍这些类:
饮料类(注册观察者、移除观察者、通知观察者、描述)
这些类是具体的饮料类
espresso、houseblend、darkroast、decaf(cost,getdescription,setcost,costchanged)
接口(interface)观察者类(更新)//成本?
interface costbehavior class(cost)//因为这个改变了?
调味品装饰器类(getdescription)
链接到 2 个接口(interface)和装饰器的具体类是:牛奶、摩卡咖啡、大 bean 、鞭子(成本、获取描述、更新)这些是我的装饰器/包装器类。
谢谢你..
有没有办法让这张图片变大?
最佳答案
我可以看到装饰器在这里发挥作用,但我不太确定在这里使用观察者。这似乎是被迫的。
几件事:
我的建议是再次阅读 Head First Design Pattern 一书(我认为您可以从中获得这些示例 :),非常相似的领域)并更好地理解这两种模式以及何时使用它们。
下面是一个装饰者和观察者一起工作的例子。饮料组合是装饰器的一个实现。订购系统是一个观察者(订单将通知寻呼机,寻呼机将执行某些操作)。这里的场景是一家星巴克咖啡店,他们会给你一个寻呼机,这样你就可以在处理饮料的同时四处走动,一旦饮料准备好,寻呼机就会通知你。
将示例保存为 drink.cs,您可以使用 csc ( C:\Windows\Microsoft.Net\Framework\v3....\csc/target:exe/out:drink.exe drink.cs 轻松编译它) 并运行它或使用 VS 或其他任何东西:)。
using System;
using System.Collections.Generic;
public interface IBeverage
{
string GetDescription();
decimal GetCost();
}
public abstract class Beverage : IBeverage
{
protected string _name;
protected decimal _cost;
public Beverage(string name, decimal cost)
{
_name = name;
_cost = cost;
}
public virtual string GetDescription()
{
return _name;
}
public virtual decimal GetCost()
{
return _cost;
}
}
public class Macchiato : Beverage
{
public Macchiato() : base("Macchiato", 3.50m) {}
}
public abstract class BeverageDecorator : Beverage
{
IBeverage _baseBeverage;
public BeverageDecorator(IBeverage baseBeverage) : base("", 0m)
{
_baseBeverage = baseBeverage;
}
public override string GetDescription()
{
return _name + " " + _baseBeverage.GetDescription();
}
public override decimal GetCost()
{
return _cost + _baseBeverage.GetCost();
}
}
public class Caramel : BeverageDecorator
{
public Caramel(IBeverage baseBeverage) : base(baseBeverage)
{
_name = "Caramel";
_cost = 0.50m;
}
}
public class Venti : BeverageDecorator
{
public Venti(IBeverage baseBeverage) : base(baseBeverage)
{
_name = "Venti";
_cost = 1.00m;
}
}
public class Iced : BeverageDecorator
{
public Iced(IBeverage baseBeverage) : base(baseBeverage)
{
_name = "Iced";
_cost = 0.25m;
}
}
public class Order
{
IBeverage _beverage;
IPager _pager;
public Order(IBeverage beverage, IPager pager)
{
_beverage = beverage;
_pager = pager;
}
public IPager Pager
{
get { return _pager; }
}
public IBeverage Beverage
{
get { return _beverage; }
}
}
public class OrderProcessing
{
Queue<Order> orders = new Queue<Order>();
public void NewOrder(IBeverage beverage, IPager pager)
{
orders.Enqueue(new Order(beverage, pager));
}
public void ProcessOrder()
{
if (orders.Count > 0)
{
var order = orders.Dequeue();
order.Pager.Update(order);
}
}
}
public interface IPager
{
void Update(Order order);
}
public class VibratingPager : IPager
{
string _number;
public VibratingPager(string number)
{
_number = number;
}
public void Update(Order order)
{
Console.WriteLine("BUZZZ");
Console.WriteLine("Your {0} is ready. Please pay {1} at the cashier after picking it up.", order.Beverage.GetDescription(),order.Beverage.GetCost());
}
}
public class Program
{
public static void Main(string[] args)
{
var orders = new OrderProcessing();
var pager1 = new VibratingPager("1");
var pager2 = new VibratingPager("2");
orders.NewOrder(new Iced(new Venti(new Caramel(new Macchiato()))), pager1);
orders.NewOrder(new Venti(new Macchiato()), pager2);
orders.ProcessOrder();
orders.ProcessOrder();
}
}
关于design-patterns - 观察者模式与装饰者模式一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4697170/
对此感到疯狂,真的缺少一些东西。 我有webpack 4.6.0,webpack-cli ^ 2.1.2,所以是最新的。 在文档(https://webpack.js.org/concepts/mod
object Host "os.google.com" { import "windows" address = "linux.google.com" groups = ["linux"] } obj
每当我安装我的应用程序时,我都可以将数据库从 Assets 文件夹复制到 /data/data/packagename/databases/ .到此为止,应用程序工作得很好。 但 10 或 15 秒后
我在 cc 模式缓冲区中使用 hideshow.el 来折叠我不查看的文件部分。 如果能够在 XML 文档中做到这一点就好了。我使用 emacs 22.2.1 和内置的 sgml-mode 进行 xm
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 我们不允许提出有关书籍、工具、软件库等方面的建议的问题。您可以编辑问题,以便用事实和引用来回答它。 关闭
根据java: public Scanner useDelimiter(String pattern) Sets this scanner's delimiting pattern to a patt
我读过一些关于 PRG 模式以及它如何防止用户重新提交表单的文章。比如this post有一张不错的图: 我能理解为什么在收到 2xx 后用户刷新页面时不会发生表单提交。但我仍然想知道: (1) 如果
看看下面的图片,您可能会清楚地看到这一点。 那么如何在带有其他一些 View 的简单屏幕中实现没有任何弹出/对话框/模式的微调器日期选择器? 我在整个网络上进行了谷歌搜索,但没有找到与之相关的任何合适
我不知道该怎么做,我一直遇到问题。 以下是代码: rows = int(input()) for i in range(1,rows): for j in range(1,i+1):
我想为重写创建一个正则表达式。 将所有请求重写为 index.php(不需要匹配),它不是以/api 开头,或者不是以('.html',或'.js'或'.css'或'.png'结束) 我的例子还是这样
MVC模式代表 Model-View-Controller(模型-视图-控制器) 模式 MVC模式用于应用程序的分层开发 Model(模型) - 模型代表一个存取数据的对象或 JAVA PO
我想为组织模式创建一个 RDF 模式世界。您可能知道,组织模式文档基于层次结构大纲,其中标题是主要的分组实体。 * March auxiliary :PROPERTIES: :HLEVEL: 1 :E
我正在编写一个可以从文件中读取 JSON 数据的软件。该文件包含“person”——一个值为对象数组的对象。我打算使用 JSON 模式验证库来验证内容,而不是自己编写代码。符合代表以下数据的 JSON
假设我有 4 张 table 人 公司 团体 和 账单 现在bills/persons和bills/companys和bills/groups之间是多对多的关系。 我看到了 4 种可能的 sql 模式
假设您有这样的文档: doc1: id:1 text: ... references: Journal1, 2013, pag 123 references: Journal2, 2014,
我有这个架构。它检查评论,目前工作正常。 var schema = { id: '', type: 'object', additionalProperties: false, pro
这可能很简单,但有人可以解释为什么以下模式匹配不明智吗?它说其他规则,例如1, 0, _ 永远不会匹配。 let matchTest(n : int) = let ran = new Rand
我有以下选择序列作为 XML 模式的一部分。理想情况下,我想要一个序列: 来自 my:namespace 的元素必须严格解析。 来自任何其他命名空间的元素,不包括 ##targetNamespace和
我希望编写一个 json 模式来涵盖这个(简化的)示例 { "errorMessage": "", "nbRunningQueries": 0, "isError": Fals
首先,我是 f# 的新手,所以也许答案很明显,但我没有看到。所以我有一些带有 id 和值的元组。我知道我正在寻找的 id,我想从我传入的三个元组中选择正确的元组。我打算用两个 match 语句来做到这
我是一名优秀的程序员,十分优秀!