zoukankan      html  css  js  c++  java
  • 组合模式

    定义与特点

    组合(Composite Pattern)模式:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系,使用户对单个对象和组合对象具有一致的访问性,属于结构型设计模式

    组合模式包含以下主要角色。

    1. 抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。在透明式的组合模式中抽象构件还声明访问和管理子类的接口;在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成。(总的抽象类或接口,定义一些通用的方法,比如新增、删除)
    2. 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于继承或实现抽象构件。
    3. 树枝构件(Composite)角色 / 中间构件:是组合中的分支节点对象,它有子节点,用于继承和实现抽象构件。它的主要作用是存储和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。

    组合模式的主要优点有:

    1. 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
    2. 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;

    其主要缺点是:

    1. 设计较复杂,客户端需要花更多时间理清类之间的层次关系;
    2. 不容易限制容器中的构件;
    3. 不容易用继承的方法来增加构件的新功能;

    UML图与代码

    **
     * 抽象构件:物品
     * @author: mxb
     * @date: 2021/10/18 16:03
     */
    public interface Articles {
      /**
       * 计算
       * @return
       */
       float calculation();
      /**
       * 输出
       */
      void show();
    }
    /**
     * 树枝构件:袋子
     * @author: mxb
     * @date: 2021/10/18 16:06
     */
    public class Bags implements Articles {
    
        private String bagName;
        private ArrayList<Articles> bags = new ArrayList();
    
        public Bags(String bagName) {
            this.bagName = bagName;
        }
    
        public void add(Articles c) {
            bags.add(c);
        }
    
        public void remove(Articles c) {
            bags.remove(c);
        }
    
        public Articles getChild(int i) {
            return bags.get(i);
        }
    
        @Override
        public float calculation() {
          float s = 0;
          for (Object obj : bags) {
            s += ((Articles) obj).calculation();
          }
          return s;
        }
    
        @Override
        public void show() {
          for (Object obj : bags) {
            ((Articles) obj).show();
          }
        }
    }
    /**
     * 树叶构件:商品
     * @author: mxb
     * @date: 2021/10/18 16:04
     */
    public class Goods implements Articles{
    
      private String goodsName;
    
      private int quantity;
    
      private float unitPrice;
      public Goods(String goodsName, int quantity, float unitPrice) {
        this.goodsName = goodsName;
        this.quantity = quantity;
        this.unitPrice = unitPrice;
      }
    
      @Override
      public float calculation() {
        return quantity * unitPrice;
      }
    
      @Override
      public void show() {
        System.out.println(goodsName + "(数量:" + quantity + ",单价:" + unitPrice + "元)");
      }
    }

    您选购的商品有:
    李宁牌运动鞋(数量:1,单价:198.0元)
    景德镇瓷器(数量:1,单价:380.0元)
    婺源特产(数量:2,单价:7.9元)
    婺源地图(数量:1,单价:9.9元)
    要支付的总价是:603.7元

  • 相关阅读:
    POJ 2752 KMP中next数组的理解
    KMP详解
    HDU 3221 矩阵快速幂+欧拉函数+降幂公式降幂
    POJ 3220 位运算+搜索
    反素数深度分析
    POJ 2886 线段树单点更新
    求反素数的方法
    CV第八课 GPU/CPU
    49. 字母异位词分组
    48. 旋转图像
  • 原文地址:https://www.cnblogs.com/isalo/p/15423413.html
Copyright © 2011-2022 走看看