设计模式--组合模式Composite(结构型)
Posted pinhole
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式--组合模式Composite(结构型)相关的知识,希望对你有一定的参考价值。
一、概念
组合模式允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
二、UML图
1.Component(对象接口),定义了对象可以做的事情。
2.Leaf(叶子结点对象)
3.Composite(其他结点对象,包含其他结点或者叶子节点)
三、例子
快递公司一般都有层级结构
/** * 顺丰公司抽象类 * 定义了公司可以做哪些事情 * @author eason * */ public abstract class SFCompany { //公司名 protected String name; //公司级别 protected int grade; public SFCompany(String name, int grade) { this.name = name; this.grade = grade; } //添加一个下属公司 public abstract void add(SFCompany sf); //删除一个下属公司 public abstract void remove(SFCompany sf); //打印自己 public void display() { for(int i=1; i<=grade; i++) { System.out.print("-----"); } System.out.println(name); } } /** * 最下层的公司 * @author eason * */ public class SFTailCompany extends SFCompany{ public SFTailCompany(String name, int grade) { super(name, grade); } @Override public void add(SFCompany sf) { throw new UnsupportedOperationException(); } @Override public void remove(SFCompany sf) { throw new UnsupportedOperationException(); } // 已经提到父类中 // @Override // public void display() { // for(int i=1; i<=grade; i++) { // System.out.print("-----"); // } // System.out.println(name); // } } /** * 有下属公司的顺丰公司 * @author eason * */ public class SFHeadCompany extends SFCompany{ //保存下属公司 private List<SFCompany> sfCompanys = new ArrayList<SFCompany>(); public SFHeadCompany(String name, int grade) { super(name, grade); } @Override public void add(SFCompany sf) { sfCompanys.add(sf); } @Override public void remove(SFCompany sf) { sfCompanys.remove(sf); } //先打印自己,在打印自己的下属 @Override public void display() { // 已经提到父类中,用super.display();代替 // for(int i=1; i<=grade; i++) { // System.out.print("-----"); // } // System.out.println(name); super.display(); for(SFCompany sf : sfCompanys) { sf.display(); } } } /** * 测试类 * @author eason * */ public class TestCompostite { public static void main(String[] args) { SFCompany head = new SFHeadCompany("总公司", 1); SFCompany shenzhen = new SFHeadCompany("深圳分公司", 2); SFCompany wuhan = new SFHeadCompany("武汉分公司", 2); SFCompany beijing = new SFHeadCompany("北京分公司", 2); SFCompany wuchang = new SFHeadCompany("武昌分公司", 3); SFCompany baoan = new SFHeadCompany("宝安分公司", 3); SFCompany luohu = new SFHeadCompany("罗湖分公司", 3); SFCompany nanshan = new SFHeadCompany("南山分公司", 3); head.add(shenzhen); head.add(wuhan); head.add(beijing); wuhan.add(wuchang); shenzhen.add(baoan); shenzhen.add(luohu); shenzhen.add(nanshan); //移除武汉 //head.remove(wuhan); head.display(); } }
四、使用场景
1.需求中体现的是整体和部分的层次关系,以及用户希望忽略整体与部分的不同,统一的使用整体对象和部分对象时,就应该考虑组合模式。
2.组合模式让你可以优化处理递归或分级数据结构。如文件系统结构。
以上是关于设计模式--组合模式Composite(结构型)的主要内容,如果未能解决你的问题,请参考以下文章