Composite Pattern
问题:
当使用遍历方法对一个集合对象遍历时, 如果这个集合包含的不仅仅是"项", 也可能包含另一个集合, 那么对"项"的遍历方法在集合上可能不通用
所以:
我们将 集合 和 项 都进行统一对待.
为它们都建造相同的方法, 已达到在遍历或者其他操作中不需要考虑 集合 当中时候含有不一样的元素
public abstract class MenuComponent { // 菜单组 // 其中可能包含 菜单项 或者是 子菜单组 public void add(MenuComponent comp) { // 对 菜单项来说, add 方法没什么意义 // 对 菜单组来说, add 可以新插入一个 菜单 或者 菜单项 } public void print() { // 对 菜单项 来说, 可能 print 就是打印所有的信息 // 但对 自菜单组来说, 打印可能就是菜单名 } // more } |
|
public class MenuItem : MenuComponent { public void add(MenuComponent comp) { throw new Exception(); } public void print() { // 如果是菜单项 直接打印 Console.WriteLine(); } } |
public class Menu : MenuComponent { // 其中可能包含 菜单组 或者 菜单项 Array<MenuComponent> array = new Array<MenuComponent>(); public void add(MenuComponent comp) { array.add(comp); } public void print() { foreach(var i in array){ // 如果是菜单组 // 则打印其中的子项 } } } |
结论:
组合模式用于 操作类似于 树形结构的对象, 将树形结构中存在于不同类型的子项用相同的方式对待.
如果某个对象不适用于其中的某个方法, 则可以使用抛出异常来处理