首页 > 编程语言 >组合设计模式Java代码快速开始

组合设计模式Java代码快速开始

时间:2024-03-19 22:14:11浏览次数:21  
标签:OrganizationComponent Java name Group 代码 void new 设计模式 public

组合模式介绍

  • 使用组合模式可以让用户可以使用统一的方式处理整个树形结构的个别对象和组合对象,从而简化客户端的操作。并且扩展性好
  • 当需要处理的对象是树形结构时可以考虑使用组合模式。
  • 节点和叶子节点存在很大差异的情况下不建议使用组合模式。

代码举例

不使用组合模式举例

一个公司有很多部门,每个部门有很多分组

 /**
 * 分组
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Group {

    //分组名称
    private String name;

    //输出分组
    public void print() {
        System.out.println(name);
    }

}
/**
 * 部门
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Department {

    //部门名
    private String name;

    //部门下所有的分组
    private List<Group> groups;

    //输出部门 分组
    public void print() {
        System.out.println("---" + name + "---");
        for (Group group : groups) {
            System.out.println(group.getName());
        }
    }

}
/**
 * 公司
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Company {

    //公司名
    private String name;

    //公司下的部门
    private List<Department> departments;

    //输出公司 部门 分组
    public void print(){
        System.out.println("-----"+name+"-----");
        for (Department department : departments){
            System.out.println("---"+department.getName()+"---");
            for (Group group : department.getGroups()){
                System.out.println(group.getName());
            }
        }
    }
}
//客户端测试用例
public static void main(String[] args) {
        //分组
        Group groupA = new Group("A组");
        Group groupB = new Group("B组");
        Group groupC = new Group("C组");
        Group groupD = new Group("D组");
        //部门
        Department department1 = new Department("开发部",
                new ArrayList<>(Arrays.asList(groupA, groupB)));
        Department department2 = new Department("财务部",
                new ArrayList<>(Arrays.asList(groupC, groupD)));
        //公司
        Company company = new Company("XXX科技公司",
                new ArrayList<>(Arrays.asList(department1, department2)));
        //输出
        company.print();
    }

使用组合模式优化后

/**
 * 组织组件
 */
public abstract class OrganizationComponent {

    private String name;


    //添加组织
    public void add(OrganizationComponent organizationComponent){
        throw new UnsupportedOperationException();
    }

    //删除组织
    public void remove(OrganizationComponent organizationComponent){
        throw new UnsupportedOperationException();
    }

    //抽象打印方法
    public abstract void print();
}
/**
 * 分组
 */
public class Group extends OrganizationComponent{

    /**
     * 分组名称
     */
    private String name;

    public Group(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    //输出名称
    @Override
    public void print() {
        System.out.println(this.getName());
    }

}
/**
 * 部门
 */
public class Department extends OrganizationComponent{

    //部门名称
    private String name;

    public Department(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    private List<OrganizationComponent> organizationComponents = new ArrayList<>();


    @Override
    public void add(OrganizationComponent organizationComponent) {
        organizationComponents.add(organizationComponent);
    }

    @Override
    public void remove(OrganizationComponent organizationComponent) {
        organizationComponents.remove(organizationComponent);
    }


    @Override
    public void print() {
        System.out.println("---"+getName()+"---");
        for (OrganizationComponent organizationComponent : organizationComponents) {
            organizationComponent.print();
        }
    }

}

/**
 * 公司
 */
public class Company extends OrganizationComponent{

    /**
     * 公司名称
     */
    private String name;

    public Company(String name){
        this.name = name;
    }

    public String getName() {
        return name;
    }

    private List<OrganizationComponent> organizationComponents = new ArrayList<>();

    @Override
    public void add(OrganizationComponent organizationComponent) {
        organizationComponents.add(organizationComponent);
    }

    @Override
    public void remove(OrganizationComponent organizationComponent) {
        organizationComponents.remove(organizationComponent);
    }
    
    @Override
    public void print(){
        System.out.println("-----"+getName()+"-----");
        for (OrganizationComponent organizationComponent : organizationComponents) {
            organizationComponent.print();
        }
    }

}

//客户端测试用例
public static void main(String[] args) {

        OrganizationComponent company = new Company("XXX开发公司");

        OrganizationComponent department1 = new Department("研发部");

        OrganizationComponent department2 = new Department("财务部");

        OrganizationComponent groupA = new Group("A组");
        OrganizationComponent groupB = new Group("B组");
        OrganizationComponent groupC = new Group("C组");
        OrganizationComponent groupD = new Group("D组");

        department1.add(groupA);
        department1.add(groupB);
        department2.add(groupC);
        department2.add(groupD);

        company.add(department1);
        company.add(department2);

        company.print();
        
    }

标签:OrganizationComponent,Java,name,Group,代码,void,new,设计模式,public
From: https://www.cnblogs.com/zwmBlog/p/18084082

相关文章

  • 打工人神器,免费帮你写代码,改代码,写文章,分析数据!
    AI技术的大火,已经对我们生活的方方面面都产生了深远的影响,也极大的提高了我们的工作效率。尤其对于码农来说,我们大部分的时间都在写代码,改代码和测代码。今天给大家安利超强的智能助手,100%国产开发,商汤科技的“小浣熊”智能助手来了。有了它可以大幅提高我们的办公效率,因为100%国......
  • 史上最全Java核心面试题(带全部答案)2024年最新版
    今天要谈的主题是关于求职,求职是在每个技术人员的生涯中都要经历多次。对于我们大部分人而言,在进入自己心仪的公司之前少不了准备工作,有一份全面细致面试题将帮助我们减少许多麻烦。在跳槽季来临之前,特地做这个系列的文章,一方面帮助自己巩固下基础,另一方面也希望帮助想要换工......
  • 【Java】使用递归完成水仙花数
    总所周知,水仙花数没什么高速的数学解法,尤其是在不确定位数时。但暴力解法实在直接粗暴,为了更唬人代码美学(真的有那样的东西吗),我用递归写了个水仙花数。importjava.util.Scanner;publicclassMain{ staticintn; //算次幂 staticintpower(intNUM){ intn......
  • 简历管理系统java+springboot+vue
    简历管理系统1、功能介绍1.1、演示视频2、系统部分功能展示管理员功能模块用户管理功能模块模板类型管理报名招聘管理3、系统分析技术可行性操作可行性1、功能介绍本文以Java为开发技术,实现了一个简历管理系统。主要功能:管理员登录,通过填写用户名、密码、角色......
  • 前端基础之JavaScript的数据类型
    一、常用的调试语句方法说明示例归属alert(msg);警告,在浏览器中弹出一个警告框,内容为alert里面的内容alert("Surprise");浏览器closole.log(msg);控制台,在控制台内输出一些内容console.log("Surprise");浏览器prompt(问题,值);对话框,第一个参数是询问内......
  • 前端基础之JavaScript引入
    一、什么是JavaScriptJavaScript是一门跨平台、面向对象的脚本语言(不需要编译,直接解释运行即可),来控制网页的行为,它能使网页可交互。脚本语言:不需要编译,运行过程中由js解释器(js引擎)逐行来进行解释并执行。现在也可以基于Node.js技术进行服务器端编程W3C标准:网页主要由......
  • 代码随想录算法训练营day28 | leetcode 93. 复原 IP 地址、78. 子集、90. 子集 II
    目录题目链接:93.复原IP地址-中等题目链接:78.子集-中等题目链接:90.子集II-中等题目链接:93.复原IP地址-中等题目描述:有效IP地址正好由四个整数(每个整数位于0到255之间组成,且不能含有前导0),整数之间用'.'分隔。例如:"0.1.2.201"和"192.168.1.1"是有效IP......
  • Java 编程实例:相加数字、计算单词数、字符串反转、元素求和、矩形面积及奇偶判断
    Java如何相加两个数字相加两个数字示例intx=5;inty=6;intsum=x+y;System.out.println(sum);//打印x+y的和输出11解释首先,声明两个int类型的变量x和y,并分别赋值为5和6。然后,使用+运算符将x和y相加,并将结果赋给变量sum。最后,使用Sy......
  • 使用java代码对数据库中的表单数据进行:增,删,改,查,操作。
    1、数据库表单如下:2、在项目中创建TestLinkMysql.java类,用于数据库的增删改查操作。代码如下: packageLink.Mysql;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLExcept......
  • raft算法和etcd代码解析-1.raft基本概念
    笔记导言该系列笔记用于GO语言和RAFT算法学习前部分介绍raft算法后部分介绍etcd代码etcd源码来自github,版本主要为ectd-3.1.5本文主要根据视频:<<raft算法工程案例之etcd源码导读>><<解析分布式共识算法之Raft算法>>以上视频作者主页:https://space.bilibili.com/317473362......