迭代器模式
假设,有2个类,分别是
BreakfastMenu
,DinerMenu
.
BreakfastMenu
维护了一个集合ArrayList
,DinerMenu
维护了一个数组.
现在想通过一个统一的接口去遍历BreakfastMenu
和DinerMenu
的所有元素,该怎么做呢?
- 常规做法是
在迭代的时候,针对数组遍历,再针对集合遍历
如下
BreakfastMenu breakfastMenu = new BreakfastMenu();
ArrayList breakfastItems = breakfastMenu.GetMenuItems();
DinerMenu dinerMenu = new DinerMenu();
MenuItem[] lunchItems = dinerMenu.GetMenuItems();
for (int i = 0; i < breakfastItems.Count; i++)
{
MenuItem menuItem = breakfastItems[i] as MenuItem;
Console.WriteLine(menuItem.GetName()+" "+menuItem.GetPrice().ToString()+" "+menuItem.GetDescription().ToString());
}
for (int j = 0; j < lunchItems.Length; j++)
{
MenuItem lunchItem = lunchItems[j] ;
if (lunchItem!=null)
{
Console.WriteLine(lunchItem.GetName() + " " + lunchItem.GetPrice().ToString() + " " + lunchItem.GetDescription().ToString());
}
}
Console.ReadKey();
这显然是设计不合理的做法,而在这种场景下,是用迭代器模式最适合不过的了.
- 迭代器模式的定义:
迭代器模式提供了一种方法顺序访问一个聚合对象中的各个元素,而又不暴露内部的实现.
- 优点
1 使用迭代器时,可以不需要知道聚合对象(或自定义集合)的实现方式,大大地简化了使用的难度
2 可以让迭代和集合对象解耦。新增迭代方式的时候可以不用修改集合对象,只需新增迭代器对象即可
组合模式
在刚才的例子中, 总菜单 > 早餐菜单 > 菜单项 . 如何在代码中体现出这种 整体与部分的层次结构呢? 组合模式可以用树的方式去展示 "整体/部分" 的层次结构.
组合模式实现的最关键的地方是——简单对象和复合对象必须实现相同的接口。这就是组合模式能够将组合对象和简单对象进行一致处理的原因。
组合模式:分为了透明组合模式和安全组合模式,透明式: 组件有一些叶子节点用不到的方法. 安全式: 就是解决透明式的这个问题而生的.通过中间接口来隔离子类用不到的方法.
《设计模式》一书中提倡:相对于安全性,我们比较强调透明性。对于第一种方式中叶子节点内不需要的方法可以使用空处理或者异常报告的方式来解决。
网友评论