10.16 练习
10-1 创建程序SingletonPattern.cpp的一个变体,使其所有函数成为静态函数。在这种情况下还需要instance()函数吗?
10-2 基于程序SingletonPattern.cpp,创建一个类,此类提供一个与某个服务的连接,这个服务向(从)一个配置文件中存取数据。
10-3 基于程序SingletonPattern.cpp,创建一个管理其固定数目对象的类。假定这些对象是数据库连接,在任何一次读/写操作中只允许使用这些对象中的某个固定数目的对象。
10-4 通过向系统中增加另外一种状态来修改程序KissingPrincess2.cpp,这样每次亲吻之后将使creature青蛙王子进入下一状态。
10-5 在《C++编程思想》第2版第1卷和第2卷中(可以从www.BruceEckel.com下载)找到头文件C16:TStack.h。为这个类创建这样一个适配器,使该类能够使用此适配器将STL算法for_each()应用于TStack的元素。创建一个元素类型为string的TStack,用字符串元素填充它,并且使用for_each()对TStack中的所有字符串中的所有字母字符进行计数。
10-6 创建一个能够从命令行中获取文件名列表的框架(即使用模板方法模式)。它把除了最后一个文件以外的所有文件作为读文件打开,最后一个文件作为写文件打开。该框架使用不确定的方法处理每个输入文件,并且将输出写到最后一个文件。利用继承于自定义的这个框架去创建两个独立的应用程序:
1)将每个文件中的所有字母转换为大写。
2)在这些文件中寻找由第1个文件给出的那些单词。
10-7 使用策略模式而不是模板方法模式来修改练习10-6。
10-8 修改程序Strategy.cpp使其包含状态行为,使其在对象Context的生存期期间能够改变策略。
10-9 修改程序Strategy.cpp,使用职责链方法,使其能尝试从不同方法中选取一种来显示出它们的名字并且不容许忘记它。
10-10 在程序ShapeFactory1.cpp中增加一个Triangle类。
10-11 在程序ShapeFactory2.cpp中增加一个Triangle类。
10-12 在程序AbstractFactory.cpp中增加一个名为GnomesAndFairies的GameEnvironment新类型。
10-13 修改程序ShapeFactory2.cpp让它用一个抽象工厂模式来创建不同的图形集合(比如说,一个特定的工厂类型对象创建“厚图形”,另一工厂类型对象创建“薄图形”,但是每个工厂对象都能够创建所有图形:圆形、矩形、三角形等等)。
10-14 修改程序VirtualConstructor.cpp使其能够在Shape:Shape(string type)中使用map而不是if-else语句。
10-15 将一个文本文件分解成单词的一个输入流(为简洁起见:输入流在空白字符处进行分解)。创建一个能将单词送入一个集合set里的构建器(builder),和另外一个能生成包含单词和统计单词出现次数的map的构建器(即对单词进行计数)。
10-16 在两个类中创建一个最小限度的Observer-Observable设计,在这个设计中没有基类,在文件Observer.h中没有额外的参数,并且在文件Observable.h中没有成员函数。仅仅用这两个类创建这个最小限度的设计,然后创建一个Observable和多个Observer,并使Observable更新Observer来演示你的设计。
10-17 修改程序InnerClassIdiom.cpp使Outer用多重继承而非内部类方法来实现。
10-18 修改程序PaperScissorsRock.java,使用表查找而非双重派遣。最容易的方法就是创建一个map的map,将每个对象的每个map的typeid(obj).name()信息作为其关键字。然后就可以这样查找:map[typeid(obj1).name()][typeid(obj2).name()]。注意如何能使系统配置更加简化。何时使用此方法比使用硬编码动态派遣更合适?能否创建一个不使用表查找而使用动态派遣的句法简洁的系统?
10-19 创建一个商业模型环境,其拥有3个Inhabitant的类型:Dwarf(用于工程师)、Elf(用于销售人员)以及Troll(用于经理)。现在创建一个名为Project的类,该类可以实例化不同的人,并且使用多重派遣使他们在相互之间使用interact()。
10-20 修改练习10-19,以便使其交互作用更加细化。每个Inhabitant能够利用getWeapon()随机产生一个Weapon:Dwarf使用Jargon或Play, Elf使用InventFeature或SellImaginaryProduct, Troll使用Edict和Schedule。在每次交互作用中决定哪些武器“赢”或“输”(就像在文件PaperScissorsRock.cpp中一样)。在Project中增加一个成员函数battle(),这个函数获得两个Inhabitant并且使它们进行对抗比赛。现在为Project创建一个成员函数meeting(),该成员函数用于创建Dwarf组、Elf组和Manager组,并且用函数battle()让这几个小组相互之间对抗,直到只有一个小组的成员剩下。这个小组就是胜利者。
10-21 在程序BeeAndFlowers.cpp加入一个Hummingbird Visitor。
10-22 加入一个Sunflower类型到程序BeeAndFlowers.cpp中,注意这样原程序需要怎样修改才能适应新增的类型?
10-23 修改程序BeeAndFlowers.cpp,不使用访问者模式,而“恢复”使用平常的类层次结构。并且将Bee变成一个收集参数方法。