设计模式-结构型- 组合模式(Composite)

来源:互联网 发布:北大青鸟软件培训 编辑:程序博客网 时间:2024/05/29 09:05

定义

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

角色

抽象构件角色(Component):声明一个接口用于访问和管理Component子部件

树叶构件角色(Leaf):在组合中表示叶子结点没有子结点

树枝构件角色(Composite):定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(Add)和删除(Remove)等

客户角色(Client):通过Component接口操纵组合部件的对象

优点

  • 组合模式可以很容易的增加新的构件
  • 使用组合模式可以使客户端变的很容易设计,因为客户端可以对组合和叶节点一视同仁

缺点

  • 使用组合模式后,控制树枝构件的类型不太容易
  • 用继承的方法来增加新的行为很困难

适用场景

  • 表示对象的部分-整体层次结构
  • 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象

类图

Composite

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();    }}

Composite_result
本文代码可在github查看:点击此处

0 0