本文實例講述了JAVA設計模式之組合模式。分享給大家供大家參考,具體如下:
組合(整體與部分關系)模式:將不同但是相關的對象組合成樹形結構以實現“部分-整體”的層次結構,使得用戶對單個對象和組合對象的使用具有一致性。
* 模式角色組成:
1.Component對象: 是組合中的對象接口,是所有類共有的接口。是用于統一定義整體中的部分。
2.Leaf對象: 整體中的部分,沒有下一級。
3.Composite對象: 用來存儲子部件,在Component接口中實現與部分有關操作。
以公司構成為例,比如公司有總公司,總公司下有分公司,分公司下有辦事處等。構成一個樹形結構。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/** * 抽象類:用來管理子類 * @description: * @date 2016-1-22 下午1:16:25 */ public abstract class Firm { private String firmName; // 公司名稱 public Firm(String firmName) { this .firmName = firmName; } public String getFirmName() { return firmName; } public void setFirmName(String name) { this .firmName = name; } protected abstract void append(Firm firm); // 添加公司如:新增分公司 protected abstract void romove(Firm firm); // 刪除公司:如因故關閉分公司 protected abstract void show( int level); //顯示公司所在的層級:總公司,分公司,辦事處等 } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
/** * 分公司對象 * @description: * @date 2016-1-22 下午1:25:43 */ public class BranchFirm extends Firm { private List<Firm> cList; public BranchFirm(String name) { super (name); cList = new ArrayList<Firm>(); } @Override protected void append(Firm firm) { cList.add(firm); } @Override protected void show( int depth) { StringBuilder sb = new StringBuilder( "" ); for ( int i = 0 ; i < depth; i++) { sb.append( "*" ); } System.out.println( new String(sb) + this .getFirmName()); for (Firm c : cList) { c.show(depth + 2 ); } } @Override protected void romove(Firm firm) { // TODO Auto-generated method stub cList.remove(firm); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
/** * Leaf結點類:公司市場部 * @description: * @date 2016-1-22 下午1:46:02 */ public class MarketDepartment extends Firm { public MarketDepartment(String name) { super (name); } @Override protected void append(Firm company) { } @Override protected void show( int depth) { // TODO Auto-generated method stub StringBuilder sb = new StringBuilder( "" ); for ( int i = 0 ; i < depth; i++) { sb.append( "*" ); } System.out.println( new String(sb) + this .getFirmName()); } @Override protected void romove(Firm company) { } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/** * Leaf結點類:公司技術部 * @description: * @date 2016-1-22 下午1:21:41 */ public class MinTechDepartment extends Firm { public MinTechDepartment(String name) { super (name); } @Override protected void append(Firm firm) { } @Override protected void show( int depth) { StringBuilder sb = new StringBuilder( "" ); for ( int i = 0 ; i < depth; i++) { sb.append( "*" ); } System.out.println( new String(sb) + this .getFirmName()); } @Override protected void romove(Firm company) { } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Firm head = new BranchFirm( "深圳XX集團有限公司" ); // 公司總部 head.append( new MarketDepartment( "深圳XX集團有限公司--市場部" )); head.append( new MinTechDepartment( "深圳XX集團有限公司--技術部" )); Firm jsFirm = new BranchFirm( "深圳XX集團有限公司-江蘇分公司" ); jsFirm.append( new MarketDepartment( "深圳XX集團有限公司-江蘇分公司市場部" )); jsFirm.append( new MinTechDepartment( "深圳XX集團有限公司-江蘇分公司技術部" )); Firm szFirm = new BranchFirm( "深圳XX集團有限公司-江蘇分公司-蘇州辦事處" ); szFirm.append( new MinTechDepartment( "深圳XX集團有限公司-江蘇分公司-蘇州辦事處技術部" )); szFirm.append( new MarketDepartment( "深圳XX集團有限公司-江蘇分公司-蘇州辦事處市場部" )); jsFirm.append(szFirm); // 如果還需要新增分公司或辦事處等,就繼續按照上述操作處理 head.append(jsFirm); head.show( 0 ); } } |
通常:在需要表示對象的整體與部分層次結構或需要忽略組合的整體對象與部分對象的不同,統一地使用整體中的部門情況下來使用組合模式。
希望本文所述對大家java程序設計有所幫助。