设计模式(九)组合模式

时间:2021-07-28 21:38:24   收藏:0   阅读:0

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、应用场景

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

 

5、优缺点

优点:

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

缺点:

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

 

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!