zoukankan      html  css  js  c++  java
  • 设计模式(九)组合模式

    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. 使设计更加抽象,对象的业务规则如果很复杂,则实现组合模式具有很大的挑战性。
    如本文有侵权行为,请及时与本人联系,多多包涵! 小生初出茅庐,多多指教!

    本文来自博客园,作者:it-小林,转载请注明原文链接:https://www.cnblogs.com/linruitao/p/15067817.html

  • 相关阅读:
    [Oracle整理]synonym及其应用
    [Oracle整理]Oracle之Procedure参数类型
    [Oracle整理]Oracle之数组
    RDL之矩陣
    [Oracle整理]数据类型大全
    [Oracle整理]Oracle之ROWTYPE和RECORD
    [Oracle整理]Oracle游标(显示游标&隐式游标&动态游标&参数游标)
    报表rdl嵌入网页(ASP.NET)
    Linux物理机忘记root密码
    python ftplib下载文件封装
  • 原文地址:https://www.cnblogs.com/linruitao/p/15067817.html
Copyright © 2011-2022 走看看