分公司=-部门--组合模式

这篇具有很好参考价值的文章主要介绍了分公司=-部门--组合模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.1 分公司不就是一部门吗?

        "我们公司最近接了一个项目,是为一家在全国许多城市都有分销机构的大公司做办公管理系统,总部有人力资源、财务、运营等部门。"
        "这是很常见的OA系统,需求分析好的话,应该不难开发的。"
        "是呀,我开始也这么想,这家公司试用了我们开发的系统后感觉不错,他们希望可以在他们的全部分公司推广,一起使用。他们在北京有总部,在全国几大城市设有分公司,比如上海设有华东区分部,然后在一些省会城市还设有办事处,比如南京办事处、杭州办事处。现在有个问题是,总公司的人力资源部、财务部等办公管理功能在所有的分公司或办事处都需要有。你说怎么办?"
        "你打算怎么办呢?"大鸟不答反问道。
        "因为你之前讲过简单复制是最糟糕的设计,所以我的想法是共享功能到各个分公司,也就是让总部、分公司、办事处用同一套代码,只是根据ID的不同来区分。"
"要糟了。"

分公司=-部门--组合模式,DesignPatterns,组合模式,java,设计模式
        "你怎么知道?的确是不行,因为他们的要求,总部、分部和办事处是成树状结构的,也就是有组织结构的,不可以简单地平行管理。这下我就比较痛苦了,因为实际开发时就得一个一个地判断它是总部,还是分公司的财务,然后再执行其相应的方法。"
        "你有没有发现,类似的这种部分与整体情况很多见,例如卖电脑的商家,可以卖单独配件,也可以卖组装整机,又如复制文件,可以一个一个文件复制粘贴,还可以整个文件夹进行复制,再比如文本编辑,可以给单个字加粗、变色、改字体,当然也可以给整段文字做同样的操作。其本质都是同样的问题。"
        "你的意思是,分公司或办事处与总公司的关系,就是部分与整体的关系?"
        "对的,你希望总公司的组织结构,比如人力资源部、财务部的管理功能可以复用于分公司。这其实就是整体与部分可以被一致对待的问题。"
        "哈,我明白了,就像你举的例子,对于Word文档里的文字,对单个字的处理和对多个字甚至整个文档的处理,其实是一样的,用户希望一致对待,程序开发者也希望一致处理。但具体怎么做呢?"
        "首先,我们来分析一下你刚才讲到的这个项目,如果把北京总公司当作一棵大树的根部的话,它的下属分公司其实就是这棵树的什么?"
        "是树的分枝,哦,至于各办事处是更小的分支,而它们的相关的职能部门由于没有分枝了,所以可以理解为树叶。"

分公司=-部门--组合模式,DesignPatterns,组合模式,java,设计模式

分公司=-部门--组合模式,DesignPatterns,组合模式,java,设计模式
        "尽管天下没有两片相同的树叶,但同一棵树上长出来的树叶样子也不会相差到哪去。也就是说,你所希望的总部的财务部管理功能也最好是能复用到子公司,那么最好的办法就是,我们在处理总公司的财务管理功能和处理子公司的财务管理功能的方法都是一样的。"

1.2 组合模式

        组合模式(Composite),将对象组合成树形结构以表示'部分-整体'的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。[DP]
组合模式(Composite)结构图

分公司=-部门--组合模式,DesignPatterns,组合模式,java,设计模式

        组合模式(Composite),将对象组合成树形结构以表示'部分-整体'的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。[DP]
组合模式(Composite)结构图
        Component为组合中的对象声明接口,在适当情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component的子部件。
        Leaf在组合中表示叶节点对象,叶节点没有子节点。
        Composite定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关的操作,比如增加add和删除remove。
        客户端代码,能通过Component接口操作组合部件的对象。

package code.chapter19.component1;

import java.util.ArrayList;

public class Test {
	
	public static void main(String[] args){

		System.out.println("**********************************************");		
		System.out.println("《大话设计模式》代码样例");
		System.out.println();		

        ConcreteCompany root = new ConcreteCompany("北京总公司");
        root.add(new HRDepartment("总公司人力资源部"));
        root.add(new FinanceDepartment("总公司财务部"));

        ConcreteCompany comp = new ConcreteCompany("上海华东分公司");
        comp.add(new HRDepartment("华东分公司人力资源部"));
        comp.add(new FinanceDepartment("华东分公司财务部"));
        root.add(comp);
        
        ConcreteCompany comp2 = new ConcreteCompany("南京办事处");
        comp2.add(new HRDepartment("南京办事处人力资源部"));
        comp2.add(new FinanceDepartment("南京办事处财务部"));
        comp.add(comp2);
        
        ConcreteCompany comp3 = new ConcreteCompany("杭州办事处");
        comp3.add(new HRDepartment("杭州办事处人力资源部"));
        comp3.add(new FinanceDepartment("杭州办事处财务部"));
        comp.add(comp3);

        System.out.println("结构图:");
        root.display(1);
        System.out.println("职责:");
        root.lineOfDuty();


		System.out.println();
		System.out.println("**********************************************");

	}
}

//公司抽象类
abstract class Company{
    protected String name;
    public Company(String name){
        this.name = name;
    }

    public abstract void add(Company company);      //增加
    public abstract void remove(Company company);   //移除
    public abstract void display(int depth);        //显示
       
    public abstract void lineOfDuty();  //履行职责
}


//具体分公司类,树枝节点
class ConcreteCompany extends Company{
    protected ArrayList<Company> children = new ArrayList<Company>();

    public ConcreteCompany(String name){
        super(name);
    }

    public void add(Company company){
        children.add(company);
    }
    public void remove(Company company){
        children.remove(company);
    }

    public void display(int depth) { 
        for(int i=0;i<depth;i++)
            System.out.print("-");
        System.out.println(name);
        for(Company item : children){
            item.display(depth+2);
        }
    }            
    
    //履行职责
    public void lineOfDuty(){
        for(Company item : children){
            item.lineOfDuty();
        }
    }
}

//人力资源部,树叶节点
class HRDepartment extends Company{
    public HRDepartment(String name){
        super(name);
    }

    public void add(Company company){
    }
    public void remove(Company company){
    }
    public void display(int depth) { 
        for(int i=0;i<depth;i++)
            System.out.print("-");
        System.out.println(name);
    }            
    //履行职责
    public void lineOfDuty(){
        System.out.println(name+" 员工招聘培训管理");
    }
}


//财务部,树叶节点
class FinanceDepartment extends Company{
    public FinanceDepartment(String name){
        super(name);
    }

    public void add(Company company){
    }
    public void remove(Company company){
    }
    public void display(int depth) { 
        for(int i=0;i<depth;i++)
            System.out.print("-");
        System.out.println(name);
    }        
    //履行职责
    public void lineOfDuty(){
        System.out.println(name+" 公司财务收支管理");
    }
}



1.3 透明方式与安全方式

        "树可能有无数的分枝,但只需要反复用Composite就可以实现树状结构了。"
        "有点懂,但还是有点疑问,为什么Leaf类当中也有add和remove,树叶不是不可以再长分枝吗?"
        "是的,这种方式叫作透明方式,也就是说,在Component中声明所有用来管理子对象的方法,其中包括add、remove等。这样实现Component接口的所有子类都具备了add和remove。这样做的好处就是叶节点和枝节点对于外界没有区别,它们具备完全一致的行为接口。但问题也很明显,因为Leaf类本身不具备add()、remove()方法的功能,所以实现它是没有意义的。"
        "哦,那么如果我不希望做这样的无用功呢?也就是Leaf类当中不用add和remove方法,可以吗?"
        "当然是可以,那么就需要安全方式,也就是在Component接口中不去声明add和remove方法,那么子类的Leaf也就不需要去实现它,而是在Composite中声明所有用来管理子类对象的方法,这样做就不会出现刚才提到的问题,不过由于不够透明,所以树叶和树枝类将不具有相同的接口,客户端的调用需要做相应的判断,带来了不便。"
        "我喜欢透明式,那样就不用做任何判断了。"
        "开发怎么能随便有倾向性?两者各有好处,视情况而定吧。"

1.4 何时使用组合模式

        "什么地方用组合模式比较好呢?"
        "当你发现需求中是体现部分与整体层次的结构时,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,就应该考虑用组合模式了。"
        "哦,我想起来了。Java开发窗体用的容器控件java.awt.Container,它继承于java.awt.Component,就有add方法和remove方法,所以在它上面增加控件,比如Button、Label、Checkbox等控件,就变成很自然的事情,这就是典型的组合模式的应用。"

分公司=-部门--组合模式,DesignPatterns,组合模式,java,设计模式

分公司=-部门--组合模式,DesignPatterns,组合模式,java,设计模式

分公司=-部门--组合模式,DesignPatterns,组合模式,java,设计模式
        "哦,对的对的,这就是部分与整体的关系。"

1.5 公司管理系统

分公司=-部门--组合模式,DesignPatterns,组合模式,java,设计模式

package code.chapter19.component0;

import java.util.ArrayList;

public class Test {
	
	public static void main(String[] args){

		System.out.println("**********************************************");		
		System.out.println("《大话设计模式》代码样例");
		System.out.println();		

        Composite root = new Composite("root");
        root.add(new Leaf("Leaf A"));
        root.add(new Leaf("Leaf B"));

        Composite comp = new Composite("Composite X");
        comp.add(new Leaf("Leaf XA"));
        comp.add(new Leaf("Leaf XB"));        
        root.add(comp);
        
        Composite comp2 = new Composite("Composite XY");
        comp2.add(new Leaf("Leaf XYA"));
        comp2.add(new Leaf("Leaf XYB"));
        comp.add(comp2);

        Leaf leaf = new Leaf("Leaf C");
        root.add(leaf);

        Leaf leaf2 = new Leaf("Leaf D");
        root.add(leaf2);
        root.remove(leaf2);

        root.display(1);


		System.out.println();
		System.out.println("**********************************************");

	}
}

abstract class Component{
    protected String name;
    public Component(String name){
        this.name = name;
    }

    public abstract void add(Component component);
    public abstract void remove(Component component);
    public abstract void display(int depth);
}

class Leaf extends Component{
    public Leaf(String name){
        super(name);
    }

    public void add(Component component){
        System.out.println("Cannot add to a leaf.");
    }

    public void remove(Component component){
        System.out.println("Cannot remove from a leaf.");
    }

    public void display(int depth){
        //叶节点的具体显示方法,此处是显示其名称和级别
        for(int i=0;i<depth;i++)
            System.out.print("-");
        System.out.println(name);
    }
}

class Composite extends Component{
    private ArrayList<Component> children = new ArrayList<Component>();//一个子对象集合用来存储其下属的枝节点和叶节点

    public Composite(String name){
        super(name);
    }

    public void add(Component component){
        children.add(component);
    }
    public void remove(Component component){
        children.remove(component);
    }
    public void display(int depth){
        //显示其枝节点名称
        for(int i=0;i<depth;i++)
            System.out.print("-");
        System.out.println(name);
        //对其下级进行遍历
        for(Component item : children){
            item.display(depth+2);
        }
    }
}



1.6 组合模式好处

        "组合模式这样就定义了包含人力资源部和财务部这些基本对象和分公司、办事处等组合对象的类层次结构。基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断地递归下去,客户代码中,任何用到基本对象的地方都可以使用组合对象了。"
        "我感觉用户是不用关心到底是处理一个叶节点还是处理一个组合组件,也就用不着为定义组合而写一些选择判断语句了。"
        "简单点说,就是组合模式让客户可以一致地使用组合结构和单个对象。"
"这也就是说,那家公司开多少个以及多少级办事处都没问题了。"哪怕开到地级市、县级市、镇、乡、村、户……"
        "喂,发什么神经了。"大鸟提醒道,"开办事处到户?你有毛病呀。"
        "不过理论上,用了组合模式,在每家每户设置一个人力资源部和财务部也是很正常的。"哪家不需要婚丧嫁娶、增丁添口等家务事,哪家不需要柴米油盐、衣食住行等流水账。"文章来源地址https://www.toymoban.com/news/detail-846175.html

到了这里,关于分公司=-部门--组合模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java组合设计模式

    组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的层次关系。组合模式依据树状结构来组合对象,用来表示部分以及整体层次。这种设计模式属于结构性模式。组合模式使得用户对单个对象和组合对象

    2024年02月15日
    浏览(50)
  • Java设计模式—组合模式(Composite Pattern)

            组合模式(Composite),将对象组合成树形结构以表示\\\'部分-整体\\\'的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 MenuComponent  抽象类:定义了菜单组件的基本行为,包括打印名称和管理子元素的方法。 Menu  类:表示菜单,可以包含其他

    2024年04月15日
    浏览(47)
  • Java23种设计模式-结构型模式之组合模式

    组合模式 (Composite Pattern):将 对象组合成树状结构 以表示“ 部分-整体 ”层次结构,同时保持对单个对象和组合对象的一致性操作,主要目的是简化客户端代码,因为它可以统一处理单个对象和组合对象。 通常包含以下几个角色: 角色1. 抽象组件 (Component):声明了 组

    2024年04月26日
    浏览(41)
  • Go和Java实现组合模式

    我们通过部门和员工的层次结构的示例来演示组合模式的用法。 组合模式,又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对 象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结

    2024年02月14日
    浏览(26)
  • Java设计模式之结构型-组合模式(UML类图+案例分析)

    目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 4.1、基本实现 4.2、菜单遍历  五、总结  组合模式(Composite Pattern)又叫部分-整体模式,它通过将对象组合成树形结构来表示“整体-部分”的层次关系,允许用户统一单个对象和组合对象的处理逻辑。 角色 描述

    2024年02月16日
    浏览(51)
  • 【设计模式——学习笔记】23种设计模式——组合模式Composite(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    编写程序展示一个学校院系结构: 需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系 【传统方式】 将学院看做是学校的子类,系是学院的子类,小的组织继承大的组织 分析: 在一个页面中展示出学校的院系组成,一个学校有多个

    2024年02月15日
    浏览(45)
  • 【Java面试题】设计模式之七种结构性模式——代理模式、适配器模式、桥接模式、装饰模式、外观模式、享元模式、组合模式

    目录 一、代理模式 二、适配器模式 三、桥接模式 四、装饰模式 五、外观模式 六、享元模式 七、组合模式 概念: 代理模式是为其他对象提供一种以代理控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对

    2023年04月09日
    浏览(52)
  • Elasticsearch:聊天机器人、人工智能和人力资源:电信公司和企业组织的成功组合

    作者:来自 Elastic Jürgen Obermann, Piotr Kobziakowski 让我们来谈谈大型企业人力资源领域中一些很酷且改变游戏规则的东西:生成式 AI 和 Elastic Stack 的绝佳组合。 现在,想象一下大型电信公司的典型人力资源部门 — 他们正在处理一百万件事情,对吗? 从回答无休止的员工查询到

    2024年01月24日
    浏览(68)
  • 创建型模式--5.建造者模式【卡雷拉公司】

    在海贼世界中, 水之都 拥有全世界最好的造船技术,三大古代兵器之一的 冥王 就是由岛上的造船技师们制造出来的。现在岛上最大、最优秀的造船公司就是卡雷拉公司,它的老板还是水之都的市长,财富权力他都有,妥妥的人生赢家。 众所周知,在冰山身边潜伏着很多卧

    2024年04月15日
    浏览(26)
  • Java 递归查询该部门,及其下属部门,所有用户

    Java 递归查询该部门,及其下属部门,所有用户: 调用方法: 参考:Java 递归查询所有下级部门 - 微酷网 递归查询父级所有下级,查询树形结构_Clackson的博客-CSDN博客_递归遍历所有下级

    2024年02月13日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包