`

设计模式------组合模式

阅读更多
这个标题说的是一种模式。。。又叫~~树模式~~整体部分模式
这个模式是为了同一树中的叶子节点和非叶子节点。。。

组合模式场景:
1。买电脑的商家,可以卖单独配件也可以卖组装整机。
2。复制文件,可以一个一个文件复制黏贴还可以整个文件夹进行复制。
3。再比如文件编辑,可以给单个字加粗,变色,改字体,也可以给整段文件做同样的操作。

组合模式使得用户对单个对象和组合对象的使用具有一致性。

我们需要写树形结构:
先写一个烂的,然后改进
public interface IRoot{
  public String getInfo();
  public void add(IBranch branch);
  public add(ILeaf leaf);
  public ArrayList getChildren();
}
public interface IBranch{
  public String getInfo();
  public void add(IBranch branch);
  public add(ILeaf leaf);
  public ArrayList getChildren();
}

public interface ILeaf{
  public String getInfo();
}
三个接口写完了,看出问题来了。。。IRoot和IBranch居然里面内容一样。。。
其实根节点就是一种枝节点,而且如果你不考虑parent的话,那么根节点就只会关心本身和他的孩子,枝节点也是只关心本身和他的孩子。。所以改进去掉IRoot

再观察: 接口是为了什么。。。是提取共性的,那么观察下IBranch和ILeaf中居然都有getInfo(); 那么这个共性是不是应该封装起来下呢?
所以先把ILeaf改名为IInfo
public interface INode{ //携带信息的能力,叶子节点和分支节点的共性
  public String getInfo();
}
然后在IBranch中复用他
public interface IChildren{ //他拥有放入IInfo和得到孩子的能力
  public List<INode> children = new ArrayList<INode>();
  public void add(INode node); 
  public List getChildren(); //并且在此扩展自己的能力
}
//注意的是:虽然本身拥有List,但是本身不提供遍历能力哈,因为不建议程序员使用迭代器模式,java提供了,那么我们还是显示的遍历下算了,因为程序写起来简单。。。中庸才是王道,面向过程有时候还是好的,要遍历的话我们就是用递归,把函数分给每个子类呗。。。不过要知道这是面向过程的递归哈。。。。。。
public class Leaf implements INode{ //他是一个Node,仅此而已 .....
}

public class Branch implements INode,IChildren{//他是一个node,而且还能装孩子  ......
}

业务逻辑中的遍历:
public static String getTreeInfo(Branch root){
   ArrayList<INode> children = root.getChildren(); 
   String info = "";
   for(INode info : children){
       if(info instanceof Leaf){
            info = info+info.getInfo()+"\n";
       }else{
            info = info+s.getInfo()+"\n" + getTreeInfo((Branch)info);//看见没,这里还是可以用多态,他有两个接口就可以在这两个接口的能力中自由转换       }
   }
  return info;
} 

下面的问题是:接口有必要吗?
如果你的IInfo接口的有许多不同的实现的话,那么接口当然有用,因为我们可以利用多态来扩展,但是这时如果不需要扩展,那么接口就多余了。。但是IInfo的实现就一种,那么用他干嘛啊。。。当然是用抽象类啦。。

改造:

public abstract class AbstractNode{ //叶子节点所需要的能力只是得到信息
  private String name = "";
  private String position = "";
  private int salary = 0;
  private AbstractNode parent;
  public Info(String name,String position,String salary){
     this.name=name;
     this.position = position;
     this.salary = salary;
  }
  public String getInfo(){
     String info = "姓名:"+this.name+"\t 职位:"+this.position+"\t薪水"+this.salary;
    return info;
  }
   public AbstractNode getParent(){ //新增,为了可以追溯到父亲
       return this.parent;
   }
   public void setParent(AbstractNode parent){
      this.parent = parent;
   }
}
public class Leaf extends AbstractNode{//继承是为了复用
   public Leaf(String name,String position,int salary){
      super(name,position,salary);
   }
}

public Branch extends AbstractNode{
   ArrayList<AbstractNode> children = new ArrayList<AbstractNode>();
    public Branch (String name,String position,int salary){
      super(name,position,salary);
   }
   public void add(AbstractNode t){
       t.setParent(this); //新增,为了反向引用
      this.children.add(t);
   }
   public ArrayList<AbstractNode> getChildren(){
      
      return this.children;
   } 
}









分享到:
评论
1 楼 502220545 2012-02-10  
你的设计模式讲解 要是带有UML图就更好了

相关推荐

    c++设计模式-结构型模式-组合模式

    c++设计模式-结构型模式-组合模式;qt工程;c++简单源码; 组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系...

    JAVA-设计模式-结构型模式-组合模式

    JAVA-设计模式-结构型模式-组合模式

    C++设计模式--基于Qt4开源跨平台开发框架

    《C++设计模式--基于Qt4开源跨平台开发框架》一书主要探讨了如何在C++编程中利用设计模式,并结合Qt4框架进行高效的跨平台应用开发。设计模式是软件工程中的重要概念,它们是经过时间和实践验证的解决特定问题的模板...

    设计模式-Java语言中的应用

    设计模式通常分为三类:创建型模式(如工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式),结构型模式(如适配器模式、装饰器模式、代理模式、桥接模式、组合模式、外观模式、享元模式)以及行为型模式(如...

    设计模式--组合模式java例子

    组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分-整体关系,使得我们能够像处理单个对象一样处理整个集合。在Java中,这种模式的应用可以帮助我们简化对复杂对象层次结构的操作,同时保持接口的...

    组合模式-空军指挥系统.zip

    总结来说,"组合模式-空军指挥系统"这一主题涉及到Java设计模式中的组合模式理论和实践,以及如何在实际的空军指挥系统项目中应用该模式。通过组合模式,我们可以构建出层次分明、易于管理和扩展的系统,使得在复杂...

    C++设计模式-基于QT4开源跨平台开发框架 源码

    C++设计模式是一种在软件开发中经过验证的解决常见问题的方法论,它为软件开发提供了标准的解决...在研究提供的源码时,读者应重点关注如何在实际场景中应用和组合这些设计模式,以及它们如何与QT4框架的特性相结合。

    设计模式-组合模式

    组合模式是一种软件设计模式,属于结构型模式,它允许我们以树形结构来表示部分与整体的关系,使得我们可以像处理单个对象一样处理整个集合。在iOS开发中,这种模式非常有用,特别是在处理数据结构或者UI组件时,...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    - 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。 - 装饰模式(Decorator):动态地给一个对象添加一些额外的职责。 - 享元模式(Flyweight):使用共享对象,有效地支持大量细...

    组合模式-------树形模式

    组合模式,也称为树形模式,是一种结构型设计模式,它允许我们表示部分-整体层次结构,使得客户端代码可以统一地处理单个对象和对象集合。这种模式将对象组织成树形结构,允许用户对部分或整个树进行操作,简化了...

    设计模式-组合模式-示例代码

    设计模式中的组合模式的示例代码。 包括透明写法和安全写法两种实现方式的示例。

    Java设计模式----通俗易懂版

    这个资源"Java设计模式----通俗易懂版"显然是一个专门针对初学者或需要深入理解设计模式的开发者编写的指南。作者以形象生动的例子解释了23种经典的Java设计模式,使得复杂的概念变得更加易于理解。 首先,我们要...

    软件设计模式--填空题+简答题(复习7).rar

    2. **设计模式分类**:设计模式通常分为三类:创建型模式(如工厂方法、抽象工厂、单例、建造者、原型)、结构型模式(如适配器、桥接、装饰、组合、代理、外观、享元)和行为型模式(如责任链、命令、解释器、迭代...

    设计模式课件大全

    设计模式06-适配器、桥接、组合模式 设计模式07-组合模式、装饰模式 设计模式09-外观模式、享元模式 设计模式10-代理模式、结构型模式大复习 设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式...

    《设计模式--基于C#的工程化实现及扩展》.(王翔)_《0528》.rar

    《设计模式--基于C#的工程化实现及扩展》是一本深入探讨软件设计模式的书籍,作者王翔通过C#语言来阐述各种设计模式的工程化应用和拓展。设计模式是软件开发中的一种最佳实践,它总结了在特定场景下解决常见问题的...

    自定义控件 - 设计模式 - 良好设计 - ViewPager

    "自定义控件 - 设计模式 - 良好设计 - ViewPager"这个主题,旨在探讨如何利用设计模式来创建高效且可维护的自定义ViewPager。ViewPager是一个常用的Android组件,它允许用户在多个视图之间滑动,常用于实现页面轮播...

    26种设计模式-----pdf

    结构型模式则关注如何将类或对象组合成更大的结构,例如适配器模式(Adapter)、装饰器模式(Decorator)、代理模式(Proxy)、桥接模式(Bridge)和组合模式(Composite)。这些模式可以帮助我们处理类与类之间的...

    c++设计模式-结构型模式-桥接模式

    c++设计模式-结构型模式-桥接模式;qt工程,c++简单源码; 桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度...

    java设计模式-组合模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段...

Global site tag (gtag.js) - Google Analytics