1、简介
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象。用来表示部分以及整体层次。这周类型的设计模式属于结构型模式,创建了对象组的树形结构。
这种模式创建了一个包含自己对象组的类,提供了修改相同对象组的方式。
组合模式类似树形结构,上一层节点的包含多个下一层的节点,而下一层的节点只依附于一个上一层的节点。
2、类图分析
主要分为以下三个角色:
- 抽象类部件:用于提供子类的共同方法,保证整体和部分的对象具有一致性;
- 叶子部件:叶子就是整体部分中的部分,不同的叶子有自己的行为;
- 整体部门:这个就是整体,拥有所有叶子的集合,对叶子资源进行管理和控制。
3、代码实例
1 /** 2 * @author it-小林 3 * @desc 店铺抽象类 4 * @date 2021年07月28日 18:24 5 */ 6 public abstract class Market { 7 String name; 8 9 public abstract void add(Market market); 10 11 public abstract void remove(Market market); 12 13 public abstract void payByCard(); 14 }
1 /** 2 * @author it-小林 3 * @desc 分店 下面可以有加盟店 4 * @date 2021年07月28日 18:27 5 */ 6 public class MarketBranch extends Market{ 7 //加盟店列表 8 List<Market> marketList = new ArrayList<>(); 9 10 public MarketBranch(String name){ 11 this.name = name; 12 } 13 14 @Override 15 public void add(Market market) { 16 marketList.add(market); 17 } 18 19 @Override 20 public void remove(Market market) { 21 market.remove(market); 22 } 23 24 @Override 25 public void payByCard() { 26 System.out.println(name + "消费,积分已累加入该会员卡"); 27 for (Market m : marketList) { 28 m.payByCard(); 29 } 30 31 } 32 }
1 /** 2 * @author it-小林 3 * @desc 4 * @date 2021年07月28日 18:30 5 */ 6 public class MaketJoin extends Market{ 7 public MaketJoin(String name){ 8 this.name = name; 9 } 10 11 @Override 12 public void add(Market market) { 13 14 } 15 16 @Override 17 public void remove(Market market) { 18 19 } 20 21 @Override 22 public void payByCard() { 23 System.out.println(name + "消费,积分已累加入该会员卡"); 24 } 25 }
1 /** 2 * @author it-小林 3 * @desc 4 * @date 2021年07月28日 18:34 5 */ 6 public class TestDemo { 7 public static void main(String[] args) { 8 Market root = new MarketBranch("总店"); 9 Market szBranch = new MarketBranch("深圳分店"); 10 Market ftJoin = new MaketJoin("福田加盟店"); 11 Market nsJoin = new MaketJoin("南山加盟店"); 12 13 szBranch.add(ftJoin); 14 szBranch.add(nsJoin); 15 root.add(szBranch); 16 root.payByCard(); 17 } 18 }
运行结果
4、应用场景
- 操作系统的资源管理器;
- GUI中的容器层次图;
- XML文件解析;
- Junit单元测试框架;
- OA系统中,组织结构的处理。
5、优缺点
优点:
- 高层模块调用简单;
- 节点*增加;
- 可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,使得增加新构件也更容易;
缺点:
- 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则;
- 使设计更加抽象,对象的业务规则如果很复杂,则实现组合模式具有很大的挑战性。