<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 組合設計模式 > 原文: [https://howtodoinjava.com/design-patterns/structural/composite-design-pattern/](https://howtodoinjava.com/design-patterns/structural/composite-design-pattern/) **組合設計模式**是修改對象結構的**結構型模式**。 此模式最適合需要使用**對象的情況,這些對象形成樹狀結構**。 在該樹中,每個節點/對象(根節點除外)都是復合節點或葉節點。 實現組合模式可使客戶統一對待單個對象和構圖。 ```java Table of Contents When to use composite design pattern Participants in composite design pattern Sample problem to solve Solution using composite design pattern Final notes ``` ## 何時使用組合設計模式 > 組合設計模式將對象組合成樹狀結構,以表示整個部分的層次結構。 復合可以使客戶統一對待單個對象和對象組成。 * 當應用具有分層結構并且需要跨結構的通用功能時。 * 當應用需要跨層次結構聚合數據時。 * 當應用要統一對待復合對象和單個對象時。 **組合設計模式**的真實示例用法可能是: 1. 建立銀行中客戶帳戶的綜合視圖(即客戶的投資組合) 2. 建立總賬 3. 計算機/網絡監控應用 4. 零售和庫存申請 5. 文件系統實現中的目錄結構 6. GUI 屏幕中的菜單項 ## 組合設計模式的參與者 以下是任何基于組合模式的解決方案的參與者。 ![Composite design pattern](https://img.kancloud.cn/dc/a6/dca6c735f6e687ced1aac70454bffd06_510x350.png) 組合設計模式 參與此模式的類和對象: 1. #### `component` * 聲明組合中對象的接口。 * 根據需要為所有類通用的接口實現默認行為。 * 聲明用于訪問和管理其子組件的接口。 2. #### `Leaf` * 表示組合中的葉對象。 葉子沒有孩子。 * 定義組合中原始對象的行為。 3. #### `composite` * 定義具有子級的組件的行為。 * 存儲子組件。 * 在`Component`接口中實現與子相關的操作。 4. #### `Client` * 通過`Component`接口操作組合中的對象。 在上圖中,客戶端使用`Component`接口與復合層次結構中的對象進行交互。 在層次結構內部,如果對象是復合對象,則它將請求傳遞給葉節點。 如果對象是葉節點,則立即處理請求。 復合葉子還可以選擇在葉子節點處理請求之前或之后修改請求/響應。 ## 要解決的示例問題 假設我們正在構建財務應用。 我們的客戶擁有多個銀行帳戶。 我們被要求準備一個設計,該設計可用于生成客戶的合并帳戶視圖,該視圖能夠在合并所有帳戶對帳單后顯示**客戶的總帳戶余額以及合并對帳單**。 因此,應用應該能夠生成: 1)客戶來自所有帳戶的總帳戶余額 2)合并帳戶對帳單 ## 使用組合設計模式的解決方案 在這里,我們正在處理形成樹狀結構的帳戶對象,在該結構中,我們將遍歷帳戶對象并僅對帳戶對象執??行一些操作,因此可以應用組合設計模式。 讓我們來看看參與的類: **`Component.java`** ```java import java.util.ArrayList; import java.util.List; public abstract class Component { AccountStatement accStatement; protected List<Component> list = new ArrayList<>(); public abstract float getBalance(); public abstract AccountStatement getStatement(); public void add(Component g) { list.add(g); } public void remove(Component g) { list.remove(g); } public Component getChild(int i) { return (Component) list.get(i); } } ``` **`CompositeAccount.java`** ```java public class CompositeAccount extends Component { private float totalBalance; private AccountStatement compositeStmt, individualStmt; public float getBalance() { totalBalance = 0; for (Component f : list) { totalBalance = totalBalance + f.getBalance(); } return totalBalance; } public AccountStatement getStatement() { for (Component f : list) { individualStmt = f.getStatement(); compositeStmt.merge(individualStmt); } return compositeStmt; } } ``` **`AccountStatement.java`** ```java public class AccountStatement { public void merge(AccountStatement g) { //Use this function to merge all account statements } } ``` **`DepositAccount.java`** ```java public class DepositAccount extends Component { private String accountNo; private float accountBalance; private AccountStatement currentStmt; public DepositAccount(String accountNo, float accountBalance) { super(); this.accountNo = accountNo; this.accountBalance = accountBalance; } public String getAccountNo() { return accountNo; } public float getBalance() { return accountBalance; } public AccountStatement getStatement() { return currentStmt; } } ``` **`SavingsAccount.java`** ```java public class SavingsAccount extends Component { private String accountNo; private float accountBalance; private AccountStatement currentStmt; public SavingsAccount(String accountNo, float accountBalance) { super(); this.accountNo = accountNo; this.accountBalance = accountBalance; } public String getAccountNo() { return accountNo; } public float getBalance() { return accountBalance; } public AccountStatement getStatement() { return currentStmt; } } ``` `Client.java` ```java public class Client { public static void main(String[] args) { // Creating a component tree Component component = new CompositeAccount(); // Adding all accounts of a customer to component component.add(new DepositAccount("DA001", 100)); component.add(new DepositAccount("DA002", 150)); component.add(new SavingsAccount("SA001", 200)); // getting composite balance for the customer float totalBalance = component.getBalance(); System.out.println("Total Balance : " + totalBalance); AccountStatement mergedStatement = component.getStatement(); //System.out.println("Merged Statement : " + mergedStatement); } } Output: Total Balance : 450.0 ``` ## 最后的筆記 1. 組合模式定義了由各個對象和復合對象組成的類層次結構。 2. 客戶端通過組件接口統一對待原始對象和組合對象,這使客戶端代碼變得簡單。 3. 添加新組件很容易,并且由于客戶端通過組件接口處理新組件,因此不需要更改客戶端代碼。 4. 可以使用迭代器設計模式遍歷復合層次結構。 5. 訪問者設計模式可以對組合應用操作。 6. 享元設計模式通常與組合結合以實現共享的葉節點。 **祝您學習愉快!**
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看