定义
将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性
角色
抽象构件角色(Component):声明一个接口用于访问和管理Component子部件
树叶构件角色(Leaf):在组合中表示叶子结点没有子结点
树枝构件角色(Composite):定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(Add)和删除(Remove)等
客户角色(Client):通过Component接口操纵组合部件的对象
优点
- 组合模式可以很容易的增加新的构件
- 使用组合模式可以使客户端变的很容易设计,因为客户端可以对组合和叶节点一视同仁
缺点
- 使用组合模式后,控制树枝构件的类型不太容易
- 用继承的方法来增加新的行为很困难
适用场景
- 表示对象的部分-整体层次结构
- 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象
类图
package com.vapy.structure.Composite;
/**
*
* @author vapy 2016年10月8日
*
* 抽象构件角色
*
*/
public abstract class StoreFront {
protected String storeName;
public String getStoreName() {
return storeName;
}
public abstract void add(StoreFront store);
public abstract void remove(StoreFront store);
// 刷卡
public abstract void payByCard();
}
package com.vapy.structure.Composite;
import java.util.ArrayList;
import java.util.List;
/**
*
* @author vapy 2016年10月8日
*
* 树枝构件角色
*
*/
public class StoreOrBranch extends StoreFront {
public StoreOrBranch() {
}
public StoreOrBranch(String storeName) {
this.storeName = storeName;
}
List<StoreFront> myStoreList = new ArrayList<StoreFront>();
@Override
public void add(StoreFront store) {
myStoreList.add(store);
}
@Override
public void remove(StoreFront store) {
myStoreList.remove(store);
}
@Override
public void payByCard() {
System.out.println(storeName + "店的积分已累加进该会员卡");
for(StoreFront sf : myStoreList) {
sf.payByCard();
}
}
}
package com.vapy.structure.Composite;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
/**
*
* @author vapy 2016年10月8日
*
* 树叶构件角色
*
*/
public class JoinInStore extends StoreFront {
public JoinInStore() {
}
public JoinInStore(String storeName) {
this.storeName = storeName;
}
@Override
public void add(StoreFront store) {
throw new NotImplementedException();
}
@Override
public void remove(StoreFront store) {
throw new NotImplementedException();
}
@Override
public void payByCard() {
System.out.println(storeName + "店的积分已累加进该会员卡");
}
}
package com.vapy.structure.Composite;
/**
*
* @author vapy 2016年10月8日
*
* 客户角色
*
*/
public class Client {
public static void main(String[] args) {
StoreOrBranch store = new StoreOrBranch("朝阳总店");
StoreOrBranch brach = new StoreOrBranch("东城分店");
JoinInStore jstore1 = new JoinInStore("东城加盟店一");
JoinInStore jstore2 = new JoinInStore("东城加盟店二");
brach.add(jstore1);
brach.add(jstore2);
store.add(brach);
store.payByCard();
}
}
本文代码可在github查看:点击此处