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 }


运行结果

设计模式(九)组合模式_组合模式_02

 

 

4、应用场景

  1. 操作系统的资源管理器;
  2. GUI中的容器层次图;
  3. XML文件解析;
  4. Junit单元测试框架;
  5. OA系统中,组织结构的处理。

 

5、优缺点

优点:

  1. 高层模块调用简单;
  2. 节点自由增加;
  3. 可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,使得增加新构件也更容易;

缺点:

  1. 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则;
  2. 使设计更加抽象,对象的业务规则如果很复杂,则实现组合模式具有很大的挑战性。

 


如本文有侵权行为,请及时与本人联系,多多包涵! 小生初出茅庐,多多指教!

作者:it-小林,转载请注明原文链接​