装饰设计模式问题?(Decorator design pattern issue?)
在“头部第一设计模式”一书中,装饰师章节讨论了装饰师处理具体类型并导致问题时的问题。 我正在复制章节中的一些问答:
问:我有点担心代码可能会测试一个特定的具体组件 - 例如,HouseBlend - 并做一些事情,比如发行折扣。 一旦我用装饰器包装HouseBlend,这就不再适用了。
答:这是完全正确的。 如果您的代码依赖于具体组件的类型,装饰器将破坏该代码。 只要您只针对抽象组件类型编写代码,装饰器的使用将对您的代码保持透明。 但是,一旦开始编写针对具体组件的代码,您将需要重新考虑应用程序设计和装饰器的使用。
有人可以给出一个简单的例子,说明'客户'代码是针对具体类型与抽象类型编写的吗? 前者如何给装饰者带来麻烦?
书中装饰器的示例测试代码如下:
public class StarbuzzCoffee { public static void main(String args[]) { Beverage beverage2 = new DarkRoast(); beverage2 = new Mocha(beverage2); beverage2 = new Mocha(beverage2); beverage2 = new Whip(beverage2); System.out.println(beverage2.getDescription() + “ $” + beverage2.cost()); ... } }
这个测试代码(也是客户端代码)是针对抽象类型编写的吗?
谢谢,
In book 'Head first design patterns', decorator chapter, it talks about issues when decorator deals with concrete type and cause problems. I am copying some Q&A in the chapter:
Q: I’m a little worried about code that might test for a specfic concrete component – say, HouseBlend – and do something, like issue a discount. Once I’ve wrapped the HouseBlend with decorators, this isn’t going to work anymore.
A: That is exactly right. If you have code that relies on the concrete component’s type, decorators will break that code. As long as you only write code against the abstract component type, the use of decorators will remain transparent to your code. However, once you start writing code against concrete components, you’ll want to rethink your application design and your use of decorators.
Could someone give simple examples on what it means that 'client' code is written against concrete type vs abstract type? And how the former cause trouble for decorator?
A sample test code of decorator in the book is like this:
public class StarbuzzCoffee { public static void main(String args[]) { Beverage beverage2 = new DarkRoast(); beverage2 = new Mocha(beverage2); beverage2 = new Mocha(beverage2); beverage2 = new Whip(beverage2); System.out.println(beverage2.getDescription() + “ $” + beverage2.cost()); ... } }
Is this test code(also a client code) written against abstract type?
Thanks,
原文:https://stackoverflow.com/questions/12634405
最满意答案
你可能会发现这更直观一点。 它只需要一个函数调用
array_splice
:$original = array( 'a', 'b', 'c', 'd', 'e' ); $inserted = array( 'x' ); // Not necessarily an array array_splice( $original, 3, 0, $inserted ); // splice in at position 3 // $original is now a b c x d e
You may find this a little more intuitive. It only requires one function call to
array_splice
:$original = array( 'a', 'b', 'c', 'd', 'e' ); $inserted = array( 'x' ); // not necessarily an array, see manual quote array_splice( $original, 3, 0, $inserted ); // splice in at position 3 // $original is now a b c x d e
If replacement is just one element it is not necessary to put array() around it, unless the element is an array itself, an object or NULL.
相关问答
更多-
你得到的数组索引超出范围错误,因为你试图插入离散索引(更像是跳过中间索引。但它不能这样工作。你不能有一个像["a", "b", _ , _ , "g", "u", _ , _ , "y"] ) 我们做一件事。 你维护一个counter var,插入该counter的位置,然后递增该计数器。 就像是: var counter: Int = 0 ... groupSelectedOldPrice.insert("your string" at:counter) counter = counter +1 ... ...
-
使用array_unshift($ array,$ item); $arr = array('item2', 'item3', 'item4'); array_unshift($arr , 'item1'); print_r($arr); 会给你 Array ( [0] => item1 [1] => item2 [2] => item3 [3] => item4 ) Use array_unshift($array, $item); $arr = array('item2', 'item3', ...
-
你可能会发现这更直观一点。 它只需要一个函数调用array_splice : $original = array( 'a', 'b', 'c', 'd', 'e' ); $inserted = array( 'x' ); // Not necessarily an array array_splice( $original, 3, 0, $inserted ); // splice in at position 3 // $original is now a b c x d e You may find ...
-
你可以这样做: $array = [ "ID" => "7917", "ProvinceCode" => "MB", "Create" => "2016-05-18 18:16:26.790", "DayOfTheWeek" => "4", "Giai1" => "28192", "Giai2" => "83509", "Giai3" => "51911-02858", "Giai4" => "14102-97270-96025-08465-8 ...
-
尝试这个: $x = array(1,2,3,4,5); $x = array_merge(array_slice($x, 0, 3), array(6), array_slice($x, 3)); print_r($x); 输出; Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 6 [4] => 4 [5] => 5 ) Try this: $x = array(1,2,3,4,5); $x = array_merge ...
-
你的$datosPost在每次迭代的while循环中被覆盖,尝试在你的代码开始处添加一个数组,如$myArr = array(); 并且在填充$datosPost之后,使用array_push($myArr, $datosPost)将它添加到$myArr (可以在if语句之后执行此操作, 也尝试var_dump($datosPost ); 在while循环中查看它是否实际得到更新, 你可以echo 'here';添加echo 'here'; 在if ($x['deprecated_nodeID'] == $ ...
-
PHP中的MongoDB - 如何将项目插入到集合中的数组中?(MongoDB in PHP - How do I insert items into an array in a collection?)[2022-05-19]
使用Mongo的$push操作: $new_task = array( "task" => "do even more stuff", "comment" => "this is the new task added" ); $collection->update( array("_id" => ObjectId("4d8653c027d02a6437bc89ca")), array('$push' => array("tasks" => $new_task)) ); Use Mongo ... -
也许我没有正确理解你,但你有没有看过array_splice() ? 这个答案可能也会让你感兴趣。 这样的东西会起作用吗? function array_insert($input, $key, $value) { if (($key = array_search($key, array_keys($input))) !== false) { return array_splice($input, $key, 1, $value); } return $in ...
-
使用javascript,你对数组中的键没有太大的灵活性。 您可能正在寻找允许您在指定索引处插入项目的array.splice函数。 一个例子: var arr = []; arr[1] = 400; arr[3] = 660; arr[5] = 594; arr.splice(3, 0, 800); // arr is now = [undefined × 1, 400, undefined × 1, 800, 660, undefined × 1, 594] 如您所见,数组现在包含未指定索引(0,2 ...
-
如何从php到html获取php数组中项目的位置整数?(How to get the position integer of an item in php array from php to html?)[2020-02-23]
只需在数组上使用标准for循环 : var topic, topic_id; for (topic_id = 0; topic_id < result.length; topic_id++) { topic = result[topic_id]; $("", {id: topic_id , text: topic, onclick: "getFaqs(this.id, $(this).text())"}).appendTo($("#topic-container"));//pass ...相关文章
更多- What Is Software Design? 先放上来有空看看~
- HDFS Append 设计文档的QA(Questions about the “Append Design”)
- 腾讯高级设计师谈微信的旧容与新妆,Android Design是大势所趋
- 《无懈可击的WEB设计(第2版)》(Bulletproof Web Design: Improving flexibility and protecting against worst-case scenarios with XHTML and CSS (2nd Edition))扫描版[PDF]
- JAVA设计模式学习12——装饰器模式
- JAVA设计模式学习14——享元模式
- java设计模式视频教程-尚学堂视频教程
- 初学设计模式【2】观察者模式——Observer
- 设计模式-工厂模式
- 设计模式-抽象工厂模式
最新问答
更多- 您如何使用git diff文件,并将其应用于同一存储库的副本的本地分支?(How do you take a git diff file, and apply it to a local branch that is a copy of the same repository?)
- 将长浮点值剪切为2个小数点并复制到字符数组(Cut Long Float Value to 2 decimal points and copy to Character Array)
- OctoberCMS侧边栏不呈现(OctoberCMS Sidebar not rendering)
- 页面加载后对象是否有资格进行垃圾回收?(Are objects eligible for garbage collection after the page loads?)
- codeigniter中的语言不能按预期工作(language in codeigniter doesn' t work as expected)
- 在计算机拍照在哪里进入
- 使用cin.get()从c ++中的输入流中丢弃不需要的字符(Using cin.get() to discard unwanted characters from the input stream in c++)
- No for循环将在for循环中运行。(No for loop will run inside for loop. Testing for primes)
- 单页应用程序:页面重新加载(Single Page Application: page reload)
- 在循环中选择具有相似模式的列名称(Selecting Column Name With Similar Pattern in a Loop)
- System.StackOverflow错误(System.StackOverflow error)
- KnockoutJS未在嵌套模板上应用beforeRemove和afterAdd(KnockoutJS not applying beforeRemove and afterAdd on nested templates)
- 散列包括方法和/或嵌套属性(Hash include methods and/or nested attributes)
- android - 如何避免使用Samsung RFS文件系统延迟/冻结?(android - how to avoid lag/freezes with Samsung RFS filesystem?)
- TensorFlow:基于索引列表创建新张量(TensorFlow: Create a new tensor based on list of indices)
- 企业安全培训的各项内容
- 错误:RPC失败;(error: RPC failed; curl transfer closed with outstanding read data remaining)
- C#类名中允许哪些字符?(What characters are allowed in C# class name?)
- NumPy:将int64值存储在np.array中并使用dtype float64并将其转换回整数是否安全?(NumPy: Is it safe to store an int64 value in an np.array with dtype float64 and later convert it back to integer?)
- 注销后如何隐藏导航portlet?(How to hide navigation portlet after logout?)
- 将多个行和可变行移动到列(moving multiple and variable rows to columns)
- 提交表单时忽略基础href,而不使用Javascript(ignore base href when submitting form, without using Javascript)
- 对setOnInfoWindowClickListener的意图(Intent on setOnInfoWindowClickListener)
- Angular $资源不会改变方法(Angular $resource doesn't change method)
- 在Angular 5中不是一个函数(is not a function in Angular 5)
- 如何配置Composite C1以将.m和桌面作为同一站点提供服务(How to configure Composite C1 to serve .m and desktop as the same site)
- 不适用:悬停在悬停时:在元素之前[复制](Don't apply :hover when hovering on :before element [duplicate])
- 常见的python rpc和cli接口(Common python rpc and cli interface)
- Mysql DB单个字段匹配多个其他字段(Mysql DB single field matching to multiple other fields)
- 产品页面上的Magento Up出售对齐问题(Magento Up sell alignment issue on the products page)