设计模式 - 组合模式

来源:互联网 发布:access表和数据库 编辑:程序博客网 时间:2024/04/27 15:13

一. 简述

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

属于结构型模式

二. 组成

  • Component类:组合中的对象声明接口,在适当情况下,实现所有类共有接口的行为。声明一个接口用于访问和管理Component的子部件。

  • Leaf类:叶节点对象。
  • Composite类:实现Componet的相关操作,比如Add和Remove操作。

三. UML类图


四. 基本代码

public abstract class Company {private String name;public Company(String name) {super();this.name = name;}public Company(){}public String getName() {return name;}public void setName(String name) {this.name = name;}protected abstract void add(Company company);protected abstract void romove(Company company);protected abstract void display(int depth);}// 枝结点类:public class ConcreteCompany extends Company {private List cList;public ConcreteCompany() {cList = new ArrayList();} public ConcreteCompany(String name) {super(name);cList = new ArrayList();} @Overrideprotected void add(Company company) {cList.add(company);}@Overrideprotected void romove(Company company) {cList.remove(company);}@Overrideprotected void display(int depth) {StringBuilder sb = new StringBuilder("");for (int i = 0; i < depth; i++) {sb.append("-");}System.out.println(new String(sb) + this.getName());for (Company c : cList) {c.display(depth + 2);}}}// 两个叶结点类:// 叶节点1public class HRDepartment extends Company {public HRDepartment(String name) {super(name);}@Overrideprotected void add(Company company) {}@Overrideprotected void romove(Company company) {}@Overrideprotected void display(int depth) {StringBuilder sb = new StringBuilder("");for (int i = 0; i < depth; i++) {sb.append("-");}System.out.println(new String(sb) + this.getName());}}//叶节点2public class FinanceDepartment extends Company {public FinanceDepartment(String name) {super(name);}@Overrideprotected void add(Company company) {}@Overrideprotected void romove(Company company) {}@Overrideprotected void display(int depth) {StringBuilder sb = new StringBuilder("");for (int i = 0; i < depth; i++) {sb.append("-");}System.out.println(new String(sb) + this.getName());}}// 客户端:public class Client {public static void main(String[] args) {Company root = new ConcreteCompany();root.setName("北京总公司");root.add(new HRDepartment("总公司人力资源部"));root.add(new FinanceDepartment("总公司财务部"));Company shandongCom = new ConcreteCompany("山东分公司");shandongCom.add(new HRDepartment("山东分公司人力资源部"));shandongCom.add(new FinanceDepartment("山东分公司账务部"));Company zaozhuangCom = new ConcreteCompany("枣庄办事处");zaozhuangCom.add(new FinanceDepartment("枣庄办事处财务部"));zaozhuangCom.add(new HRDepartment("枣庄办事处人力资源部"));Company jinanCom = new ConcreteCompany("济南办事处");jinanCom.add(new FinanceDepartment("济南办事处财务部"));jinanCom.add(new HRDepartment("济南办事处人力资源部"));shandongCom.add(jinanCom);shandongCom.add(zaozhuangCom);root.add(shandongCom);root.display(0);}}

五. 优缺点

优点:

  1. 组合模式可以很容易的增加新的构件。

  2. 使用组合模式可以使客户端变的很容易设计,因为客户端可以对组合和叶节点一视同仁。

缺点:

  1. 使用组合模式后,控制树枝构件的类型不太容易。

  2. 用继承的方法来增加新的行为很困难。

六. 应用场景

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


原创粉丝点击