前言
本文次要讲述组合模式,文中应用通俗易懂的案例,使你更好的学习本章知识点并了解原理,做到有道无术。
一.什么是组合模式
组合模式是23种设计模式中结构型模式的一种,它创立了对象组的树形构造,将对象组合成树形构造以示意“局部-整体”的层次结构。组合模式使得用户对单个对象和组合对象的应用具备一致性。
二.生存中的组合模式
1.文件夹
在咱们的电脑外面会存在很多材料,不论是学习材料、工作材料还是各种游戏。咱们都不会抉择一股脑地都放在一个盘下,而是会进行分门别类。比方江帅的电脑, D 盘里有个目录为 workspace 外面会寄存各种代码, Program Files 会寄存各种装置软件,game 外面会寄存各种游戏,这样就能不便咱们治理硬盘里内容,而这种分类形式就跟组合模式一样。
2.企业治理
在各个企业里都会有不同的部门以及不同级别的领导,比方级别最高是 CEO (首席执行官)和 CTO (首席技术官)等等,在之下有各部门的总监,副总监,之后是部长和各部门的主管,最初才是基层员工和实习生,而这种分类可能让企业治理起来更加地高效,这种治理形式就跟组合模式一样。
3.军队治理
目前在中国的军队中,军衔分为2等10级,如此划分不仅仅只是能力跟待遇的区别,也是为了更好的进行军队治理,而这种治理形式就跟组合模式一样。
三.组合模式的实现
接下来咱们以所在的公司来举例,通过组合模式来实现。公司里有多个职能核心,每个职能核心中有一个或者多个部门。
首先咱们先创立一个形象构件(Component)角色
package com.qianfeng.ran;/* * @author:江帅 * 形象构建角色 */public abstract class Component { //名称 private String name; //职责 private String responsibility; public Component(String name, String responsibility) { this.name = name; this.responsibility = responsibility; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getResponsibility() { return responsibility; } public void setResponsibility(String responsibility) { this.responsibility = responsibility; } /** * 默认实现 * @param component */ protected void add(Component component) { throw new UnsupportedOperationException("该办法不反对"); } protected void remove(Component component) { throw new UnsupportedOperationException("该办法不反对"); } /** * 打印办法 */ protected abstract void print();}
而后创立两个树枝构件角色公司类和组织类
package com.qianfeng.ran;import java.util.ArrayList;import java.util.List;/* * @author:江帅 * 树枝构件角色 * 公司类 */public class Company extends Component { //寄存组织的汇合 private List<Component> organizationList = new ArrayList<>(); public Company(String name, String responsibility) { super(name, responsibility); } //增加组织进公司 @Override protected void add(Component component) { organizationList.add(component); } //删除公司的组织 @Override protected void remove(Component component) { organizationList.remove(component); } @Override protected void print() { //打印公司名和职责 System.out.println("---------"+getName()+":"+getResponsibility()+"---------"); //遍历公司里的组织 organizationList.forEach(Component::print); }}
/* * @author:江帅 * 树枝构件角色 * 组织类 */class Organization extends Component{ //寄存部门的汇合 private List<Component> departmentList = new ArrayList<>(); public Organization(String name, String responsibility) { super(name, responsibility); } //增加部门进组织 @Override protected void add(Component component) { departmentList.add(component); } //删除组织里的的部门 @Override protected void remove(Component component) { departmentList.remove(component); } @Override protected void print() { //打印组织名和职责 System.out.println("------"+getName()+":"+getResponsibility()+"------"); //遍历组织的部门 departmentList.forEach(Component::print); }}
创立一个树叶构件角色部门类
package com.qianfeng.ran;/* * @author:江帅 * 树叶构件角色 * 部门类 */public class Department extends Component { public Department(String name, String responsibility) { super(name, responsibility); } @Override protected void print() { //打印部门名和职责 System.out.println(getName()+":"+getResponsibility()); }}
最初咱们通过组合模式构建公司构造
package com.qianfeng.ran;/* * @author:江帅 * 客户端 */public class Demo { public static void main(String[] args) { //创立公司对象 Component company = new Company("千锋教育","为中国造就业余IT人才"); //创立组织对象 Component educationOrganization = new Organization("IT特训营","教学质量保障"); Component serviceOrganization = new Organization("服务保障部","教学服务保障"); //创立部门对象并增加到指定的组织对象中 educationOrganization.add(new Department("Java部门","造就将来Java大佬")); educationOrganization.add(new Department("HTML部门","造就将来前端大佬")); educationOrganization.add(new Department("云计算部门","造就将来云计算大佬")); serviceOrganization.add(new Department("品质保障部","辅导监督将来大佬学习")); serviceOrganization.add(new Department("企业合作部","与优良企业单干并辅导将来大佬待业")); //增加组织到公司对象中 company.add(educationOrganization); company.add(serviceOrganization); //打印公司构造与职责 //执行后果: //---------千锋教育:为中国造就业余IT人才--------- //------IT特训营:教学质量保障------ //Java部门:造就将来Java大佬 //HTML部门:造就将来前端大佬 //云计算部门:造就将来云计算大佬 //------服务保障部:教学服务保障------ //品质保障部:辅导监督将来大佬学习 //企业合作部:与优良企业单干并辅导将来大佬待业 company.print(); }}
四.总结
组合模式使得客户端代码能够统一地解决单个对象和组合对象,毋庸关怀本人解决的是单个对象,还是组合对象,这简化了客户端代码;就像治理一个部门,你身为部门总监,工作下发后,不论是基层员工实现还是部门领导实现都是一样的。
然而相对而言就须要客户端对类之间的档次关系较为分明,意思就是治理企业,必须分明公司里的整个架构每个组织每个部门以及对应的职能,才可能很好地去治理企业。
学习Java设计模式全套技术常识,欢送关注以下收费课程!
https://www.bilibili.com/video/BV1GW4y1e7wC/?aid=943587741&ci...