.NET 工业控制 OPC Matlab

关注工控软件的简单化

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
    Composite 模式在设计模式里属于比较容易理解和实现的模式了,实现一个Composite模式很简单,我们能使用很少的代码就实现了 Composite  模式,但 Composite  模式确带来了很多问题或是思考.
    Composite 模式有两个重要的思想.合成要既可以包含单项也可以包含单项的集合或集合的集合(就叫他合成吧).第二个重要的思想是为单独的项和合成定义相同的行为.这样我们访问 Composite  的对象时(不管是合成或是叶) 都可以使用同一个接口或抽象.
    在使用Composite 模式时我们会首先定义三个基本的类,顶层抽象类 Component,合成 Composite,叶(感觉还是叫叶比较形象)Leaf.
    如果只考虑合成的两个思想我们在设计 Composite 模式的顶层抽象时可以使用接口
     public interface IComponent
     {
     }
     (名字和.NET 的 System.ComponentModel.IComponent 有冲突,不怕咱有命名空间 ^-^)
     为了实现第一个思想我们可以在接口中加入两个方法
     public interface IComponent
     {
             void AddComponent(IComponent component);
             void RemoveComponent(IComponent component);
     }
     然后我们定义两个类 Composite 和 Leaf 实现这个接口.
     好了,到现在我们实现了一个最简易的 Composite  模式.现在这一个接口和俩类能干嘛,嘛也干不了.
     为了能在合成对象中添加合成对象或叶对象我们需要在 Composite 类中定义一个 IList 对象存放这些添加到这个合成对象的合成对象或叶(饶口令),然后实现接口里的俩方法.
    那 Leaf 类需要这个变量吗 ? 当然不需要,叶里什么也不能加啊,可既然叶不能添加别的对象,就是说
    void AddComponent(IComponent component);
    void RemoveComponent(IComponent component); 这两个方法在叶 Leaf 类里没有任何作用,干嘛我们要实现他,
为什么不能把这两个方法在 Composite 类中定义呢,这好象又和 Composite 模式的第二个思想有点不符啊.郁闷. 
    在实际应用中,很少会用接口来实现顶层的抽象,因为我们在访问  Composite 中的对象时会用到迭代器或使用 Vistor 模式(最有争议的模式),这时候如果我们的 Composite 模式的对象不是树结构的话,就会进入死循环.所有我们一般使用抽象类实现顶层的抽象,并在类中加入判断合成是否是树结构的方法.... (今天连写了两篇文章,比我去年文章的总和还多^-^)还是明天在接着写吧
posted on 2008-01-09 22:11  TomCat  阅读(456)  评论(1编辑  收藏  举报