设计模式 - 组合模式
来源:互联网 发布: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);}}
五. 优缺点
优点:
组合模式可以很容易的增加新的构件。
使用组合模式可以使客户端变的很容易设计,因为客户端可以对组合和叶节点一视同仁。
缺点:
使用组合模式后,控制树枝构件的类型不太容易。
用继承的方法来增加新的行为很困难。
六. 应用场景
- 想表示对象的部分-整体层次结构。
- 希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
- 设计模式:组合模式
- 设计模式-----组合模式
- 设计模式 组合模式
- 设计模式--组合模式
- 设计模式---组合模式
- 【设计模式】组合模式
- 设计模式 - 组合模式
- 设计模式----组合模式
- 设计模式 - 组合模式
- 设计模式:组合模式
- 设计模式 - 组合模式
- 设计模式-组合模式
- 设计模式 - 组合模式
- 【设计模式】组合模式
- 设计模式--组合模式
- 设计模式-组合模式
- 设计模式:组合模式
- 设计模式-----组合模式
- duplicate symbols for architecture i386 问题
- 服务器硬盘接口图文观赏
- GDB调试手册
- C#如何取出非公共成员
- NAS技术详解:核心文件系统WFAL/SnapShot技术详解
- 设计模式 - 组合模式
- 有关计数排序的扩展性
- Android 的 init.rc 文件简介
- 修改 mysql 表类型 实际测试可执行
- P2P 之 UDP穿透NAT的原理与实现(附源代码)
- C++运算符能否重载以及优先级问题
- java中hashcode()和equals()的详解
- JavaScript基础之继承1
- rsync