码迷,mamicode.com
首页 > 编程语言 > 详细

大话设计模式_组合模式(Java代码)

时间:2014-06-09 16:20:55      阅读:382      评论:0      收藏:0      [点我收藏+]

标签:android   c   style   class   blog   code   

组合模式:将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

简单描述:1个Composite类,里面持有一个容器成员,容器可以存入自身

大话设计模式中的截图:

bubuko.com,布布扣

代码例子:

AbstractComponent类:

bubuko.com,布布扣
 1 package com.longsheng.composite;
 2 
 3 public abstract class AbstractComponent {
 4     
 5     public abstract void addComp(AbstractComponent mAbstractComponent);
 6 
 7     public abstract void removeComp(AbstractComponent mAbstractComponent);
 8 
 9     public abstract void display(int depth);
10 
11 }
bubuko.com,布布扣

Component类:

bubuko.com,布布扣
 1 package com.longsheng.composite;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 public class Component extends AbstractComponent {
 7 
 8     private List<AbstractComponent> container = new ArrayList<AbstractComponent>();
 9     private String name;
10 
11     public Component(String name) {
12         this.name = name;
13     }
14 
15     @Override
16     public void addComp(AbstractComponent mAbstractComponent) {
17         if(mAbstractComponent != null && mAbstractComponent == this) {
18             return;//不能添加自己否则会形成死循环
19         }
20         container.add(mAbstractComponent);
21     }
22 
23     @Override
24     public void removeComp(AbstractComponent mAbstractComponent) {
25         if( mAbstractComponent != null && mAbstractComponent == this ) {
26             return;
27         }
28         container.remove(mAbstractComponent);
29     }
30 
31     @Override
32     public void display(int depth) {
33         String temp = "";
34         for (int i = 0; i < depth; i++) {
35             temp += "-";
36         }
37         System.out.println(temp + name);
38         for (AbstractComponent mComponent : container) {
39             mComponent.display(depth + 2);
40         }
41     }
42 
43 }
bubuko.com,布布扣

Leaf类:

bubuko.com,布布扣
 1 package com.longsheng.composite;
 2 
 3 public class Leaf extends AbstractComponent {
 4 
 5     private String name;
 6     
 7     public Leaf( String name ) {
 8         this.name = name;
 9     }
10     
11     @Override
12     public void addComp(AbstractComponent mAbstractComponent) {
13     }
14 
15     @Override
16     public void removeComp(AbstractComponent mAbstractComponent) {
17     }
18 
19     @Override
20     public void display(int depth) {
21         String temp = "";
22         for (int i = 0; i < depth; i++) {
23             temp += "-";
24         }
25         System.out.println(temp + name);
26     }
27 
28 }
bubuko.com,布布扣

客户端:

bubuko.com,布布扣
 1 package com.longsheng.composite;
 2 
 3 public class Client {
 4 
 5     public static void main(String args[]) {
 6         Component mRoot = new Component("总公司");
 7         Leaf mRootHR = new Leaf("总公司人力资源部");
 8         Leaf mRootFinance = new Leaf("总公司财务部");
 9         mRoot.addComp(mRootHR);
10         mRoot.addComp(mRootFinance);
11         
12         Component mSub = new Component("华东分公司");
13         Leaf mSubHR = new Leaf("华东分公司人力资源部");
14         Leaf mSubFinance = new Leaf("华东分公司财务部");
15         mSub.addComp(mSubHR);
16         mSub.addComp(mSubFinance);
17         
18         Component mNanjing = new Component("南京分公司");
19         Leaf mNanjingHR = new Leaf("南京分公司人力资源部");
20         Leaf mNanjingFinance = new Leaf("南京分公司财务部");
21         mNanjing.addComp(mNanjingHR);
22         mNanjing.addComp(mNanjingFinance);
23         
24         Component mHangzhou = new Component("杭州分公司");
25         Leaf mHangzhouHR = new Leaf("杭州分公司人力资源部");
26         Leaf mHangzhouFinance = new Leaf("杭州分公司财务部");
27         mHangzhou.addComp(mHangzhouHR);
28         mHangzhou.addComp(mHangzhouFinance);
29         
30         mRoot.addComp(mSub);
31         mSub.addComp(mNanjing);
32         mSub.addComp(mHangzhou);
33         
34         mRoot.display(0);
35     }
36 
37 }
bubuko.com,布布扣

运行结果:

bubuko.com,布布扣
 1 总公司
 2 --总公司人力资源部
 3 --总公司财务部
 4 --华东分公司
 5 ----华东分公司人力资源部
 6 ----华东分公司财务部
 7 ----南京分公司
 8 ------南京分公司人力资源部
 9 ------南京分公司财务部
10 ----杭州分公司
11 ------杭州分公司人力资源部
12 ------杭州分公司财务部
bubuko.com,布布扣

Leaf类可以不必继承AbstractComponent类,以和树枝节点区分开,这需要在具体业务中进行选择。

这个模式在图形控件中经常使用,如在Android中,ViewGroup是View的子类,ViewGroup可以装入View;在Java—AWT中,JPanel是一个Component,同时有个add方法可以装入Component

大话设计模式_组合模式(Java代码),布布扣,bubuko.com

大话设计模式_组合模式(Java代码)

标签:android   c   style   class   blog   code   

原文地址:http://www.cnblogs.com/creasylai19/p/3776359.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!