8.3 使用组合行为

在这一章,我们所讨论处理行为的应用程序或组件,能够在开发的后期,甚至在运行时添加新的行为;关键的设计思想是要保证添加新的行为要尽可能容易。在我们实现新的功能之后,应该可以注册这个函数(例如,通过将其添加到列表),并在应用程序使用,而不需要修改任何代码。

为使问题简化,最好是使需要实现的函数数量最小化。通常情况下,一个函数足以表示功能,但在某些情况下,可能需要包含额外的信息,或提供更多的函数,就不够了。当然,在函数式程序中,其他的函数是唯一的“额外的信息”,我们可以运行信息以提供更丰富的反馈。

第一种情况的一个例子可能是图形编辑器中的滤镜。滤镜本身是处理图片的函数,但我们也可以提供滤镜的名字(作为一个字符串)。编辑器的用户无论何时调用我们的函数,更愿意看到“友好”的名字和描述,而不是所有的内在命名约束。

在下一节,我们将看到第二种情况,即,需要更多的函数。我们将改进贷款程序,使检查可以报告更多的细节,如果客户检查“失败”,为什么建议拒绝贷款,将使用第二个函数,输出报告。

时间: 2024-08-29 23:13:28

8.3 使用组合行为的相关文章

[js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表

所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理,由主板,电源,内存条,显卡, 机箱,显示器,外设等组成的 把一个成型的产品组成部件,分成一个个独立的部件,这种方式可以做出很多灵活的产品,这就是组合模式的优势 比如:家用台式机电脑,要求配置比较低, 这个时候只需要主板+电源+内存条+机箱+显示器+外设就可以了,不需要配置独立显卡 鸡腿堡+鸡翅+紫薯

组合模式(Composite)

一.组合模式介绍 组合模式:将对象组合成树形结构以表示:部分--整体 的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. java中的组合是指:在A类里定义一个B类的引用,A拥有了B,叫组合.只是单纯的组合而已,而不是一种设计模式. 组合和组合模式不是一回事! 基本上见到的树形结构都使用到了组合模式. 组合模式结构图: 组合模式中有几个核心的部分: Leaf(叶子):表示该节点下面没有其他子节点了,就称为叶子 Compostie(容器构件):容器构件,该节点下还有其他子节点,理解

webform:分页组合查询

一个简单的分页组合查询页面 /// <summary> /// 查询方法 /// </summary> /// <param name="tsql">SQL语句</param> /// <param name="hh">哈希表</param> /// <returns></returns> public List<Goods> Select(string un

字符串排列组合算法

第二个算法是我笔试题遇到的,当时没有做出来,在网上看到别人写的算法,感觉太精妙了,就在这里分享出来. 全排列 所谓全排列,就是打印出字符串中所有字符的所有排列.例如输入字符串abc,则打印出 a.b.c 所能排列出来的所有字符串 abc.acb.bac.bca.cab 和 cba . #include<stdio.h> #include<string.h> static int number=0; void Swap(char *a ,char *b) { char temp =

WebForm 分页与组合查询

1.封装实体类 2.写查询方法 //SubjectData类 public List<Subject> Select(string name) { List<Subject> list = new List<Subject>(); cmd.CommandText = "select *from Subject where SubjectName like @a "; cmd.Parameters.Clear(); cmd.Parameters.Add

UVALive-7304 - Queue of Soldiers 【动态规划】【组合函数】【好题】

UVALive- 7304 - Queue of Soldiers 题目链接:7304 题目大意:士兵过山洞,必须以类似7 6 5 4 3 2 1顺序过.在第i个人之后,比i高的人都会被杀死,问如果要杀死k个人,有几种排队方法. 题目思路:先将士兵的身高离散化.假设N表示不同身高的数目.cnt[i] 表示i这个身高的人有多少个.(i的范围为1~N)sum[i]表示小于等于该身高段的士兵数目 然后开始dp,dp[i][j]表示已经到第i个士兵,已经死了j个人的方法数. 第三维遍历,q表示,第i+1

关于继承和组合的一点总结

入行时一直用c++写端游的逻辑,对这两者的区别几乎是0. 最先意识到有不同是在看了设计模式之后,但也没啥自己想法,代码照旧,只是依稀有个印象:都说组合好,少用继承. 用c++的那段时间对这句经验是没多少感受的.后来用erlang.lua.go开始自己设计搭建基础框架,这才在编码层级感受到两者的巨大不同. 一个印象非常深的例子:上个手游项目MOBA大改造,首先要做个类似dota的开房间系统,5v5. 想想房间也就是个小号地图嘛,便着手把嵌在活动中的地图代码扣了出来.做成单独的功能类,LogicMa

组合选择符

在 CSS3 中包含了四种组合方式: 后代选取器(以空格分隔) 子元素选择器(以大于号分隔) 相邻兄弟选择器(以加号分隔) 普通兄弟选择器(以破折号分隔) 1. 后代选取器 所有 <p> 元素插入到 <div> 元素中   <p><div></div></p> div p{background:yellow} 2. 子元素选择器 <div>元素中所有直接子元素 <p>  <div><p>

【BZOJ-1974】auction代码拍卖会 DP + 排列组合

1974: [Sdoi2010]auction 代码拍卖会 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 305  Solved: 122[Submit][Status][Discuss] Description 随着iPig在P++语言上的造诣日益提升,他形成了自己一套完整的代码库.猪王国想参加POI的童鞋们都争先恐后问iPig索要代码库.iPig不想把代码库给所有想要的小猪,只想给其中的一部分既关系好又肯出钱的小猪,于是他决定举行了一个超大型拍

使用脚本选项及组合条件测试

使用脚本选项及组合条件测试: 整数测试: -le 小于等于 -lt 小于 -ge大于等于 -gt大于 -eq等于 -ne不等于 字符测试: == 等于 != 不等于 >大于 <小于 -n 测试字符串是否为空,空为真 -z 测试字符串是否不为空,不空为真 文件测试: -e 测试文件是否存在 -f 测试文件是否为普通文件 -d测试文件是否为目录 -r测试文件是否有读权限 -w测试文件是否有写权限 -x 测试文件是否有执行权限 组合测试条件 -a 逻辑与 都满足 -o 逻辑或 满足一条即可 !  非