Java常用设计模式————组合模式
引言
組合模式,是一種類似遞歸算法的結(jié)構(gòu)性設(shè)計(jì)模式,通過以簡(jiǎn)單的 List ,組合本類對(duì)象,實(shí)現(xiàn)樹狀對(duì)象結(jié)構(gòu)的“部分、整體”的層次。
它可以讓調(diào)用程序不需要關(guān)心復(fù)雜對(duì)象與簡(jiǎn)單對(duì)象的區(qū)別,而統(tǒng)一地實(shí)現(xiàn)處理邏輯。
對(duì)于個(gè)體與整體存在一定共性的數(shù)據(jù)場(chǎng)景的展示非常有幫助,比如省市區(qū)的樹狀結(jié)構(gòu),領(lǐng)導(dǎo)與員工、校院系等。
一、組合模式的類圖結(jié)構(gòu)
用套娃形容組合模式非常貼切,其編碼核心其實(shí)就是用數(shù)組來組合下級(jí)對(duì)象,而下級(jí)對(duì)象本身也屬于此類實(shí)例。一般就是用于描述某種極具共性的實(shí)體類,如省、市、區(qū);領(lǐng)導(dǎo)、員工等。
二、組合模式的代碼實(shí)現(xiàn)
package com.mht.demo.組合模式;import java.util.ArrayList; import java.util.List;public class Employee {private String name;private String dept;private int salary;/** 通過數(shù)組組合自身對(duì)象*/private List<Employee> subordinates;public Employee(String name, String dept, int salary) {this.name = name;this.dept = dept;this.salary = salary;this.subordinates = new ArrayList<>();}public void add(Employee emp) {this.subordinates.add(emp);}public void remove(Employee emp) {this.subordinates.remove(emp);}public List<Employee> getSubordinates() {return subordinates;}@Overridepublic String toString() {return "{\"name\":\"" + name + "\", \"dept\":\"" + dept + "\", \"salary\":\"" + salary + "\", \"subordinates\":"+ subordinates + "}";} }測(cè)試代碼:
public class Client {public static void main(String[] args) {// 最上層員工,同時(shí)也是最高領(lǐng)導(dǎo)Employee ceo = new Employee("馬云", "CEO", 30000);// 中層員工,同時(shí)也是中層領(lǐng)導(dǎo)Employee headSales = new Employee("Robert", "銷售部", 20000);Employee headMarketing = new Employee("Michel", "市場(chǎng)部", 20000);// 基層員工,奮斗在業(yè)務(wù)一線Employee salesEmp = new Employee("Richard", "銷售部", 10000);Employee salesEmp2 = new Employee("Rob", "銷售部", 10000);Employee marketEmp = new Employee("Laura", "市場(chǎng)部", 10000);Employee marketEmp2 = new Employee("Bob", "市場(chǎng)部", 10000);ceo.add(headSales);ceo.add(headMarketing);headSales.add(salesEmp);headSales.add(salesEmp2);headMarketing.add(marketEmp);headMarketing.add(marketEmp2);// 打印CEO的管理層級(jí)System.out.println("CEO的管理層級(jí):" + ceo);for (Employee headEmp : ceo.getSubordinates()) {System.out.println(headEmp);for (Employee subEmp : headEmp.getSubordinates()) {System.out.println(subEmp);}}} }測(cè)試結(jié)果:
CEO的管理層級(jí):{"name":"馬云", "dept":"CEO", "salary":"30000", "subordinates":[{"name":"Robert", "dept":"銷售部", "salary":"20000", "subordinates":[{"name":"Richard", "dept":"銷售部", "salary":"10000", "subordinates":[]}, {"name":"Rob", "dept":"銷售部", "salary":"10000", "subordinates":[]}]}, {"name":"Michel", "dept":"市場(chǎng)部", "salary":"20000", "subordinates":[{"name":"Laura", "dept":"市場(chǎng)部", "salary":"10000", "subordinates":[]}, {"name":"Bob", "dept":"市場(chǎng)部", "salary":"10000", "subordinates":[]}]}]} {"name":"Robert", "dept":"銷售部", "salary":"20000", "subordinates":[{"name":"Richard", "dept":"銷售部", "salary":"10000", "subordinates":[]}, {"name":"Rob", "dept":"銷售部", "salary":"10000", "subordinates":[]}]} {"name":"Richard", "dept":"銷售部", "salary":"10000", "subordinates":[]} {"name":"Rob", "dept":"銷售部", "salary":"10000", "subordinates":[]} {"name":"Michel", "dept":"市場(chǎng)部", "salary":"20000", "subordinates":[{"name":"Laura", "dept":"市場(chǎng)部", "salary":"10000", "subordinates":[]}, {"name":"Bob", "dept":"市場(chǎng)部", "salary":"10000", "subordinates":[]}]} {"name":"Laura", "dept":"市場(chǎng)部", "salary":"10000", "subordinates":[]} {"name":"Bob", "dept":"市場(chǎng)部", "salary":"10000", "subordinates":[]}格式化后的結(jié)果:
{"name":"馬云","dept":"CEO","salary":"30000","subordinates":[{"name":"Robert","dept":"銷售部","salary":"20000","subordinates":[{"name":"Richard","dept":"銷售部","salary":"10000","subordinates":[]},{"name":"Rob","dept":"銷售部","salary":"10000","subordinates":[]}]},{"name":"Michel","dept":"市場(chǎng)部","salary":"20000","subordinates":[{"name":"Laura","dept":"市場(chǎng)部","salary":"10000","subordinates":[]},{"name":"Bob","dept":"市場(chǎng)部","salary":"10000","subordinates":[]}]}] }總結(jié)
組合模式的使用場(chǎng)景非常特定,一般就是在輸出打印樹狀結(jié)構(gòu)型數(shù)據(jù)時(shí)才會(huì)用到。
它模糊了簡(jiǎn)單元素和復(fù)雜元素的概念,客戶端程序可以像處理簡(jiǎn)單元素一樣來處理復(fù)雜元素,從而使客戶端與復(fù)雜元素的內(nèi)部結(jié)構(gòu)解耦。
定義時(shí),通過List組織自身對(duì)象。同時(shí)也并未用到抽象類或接口。
注意為數(shù)組提供必要的添加和移除方法。
?
總結(jié)
以上是生活随笔為你收集整理的Java常用设计模式————组合模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php四则运算出题器_php实现简单四则
- 下一篇: 计算机桌面设置定时,如何设置可以每月自动