ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java设计模式(十二)——组合模式

2020-07-17 09:32:49  阅读:286  来源: 互联网

标签:java name Composite 十二 Dept 开发部 new 设计模式 public


组合模式( Composite Pattern )也称为整体部分( Part-Whole )模式,它的宗旨是通过将单个
对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示,使得客户对单个对象和组合对象的
使用具有一致性,属于结构型模式。

组合模式是一种树结构,那么就知道生活中得案例了,比如 目录-文件,学校-年级-班级,公司-部门

组合模式分为透明模式和安全模式

 

透明模式类图:

 

 

 安全模式类图:

 

 

 两者的区别在于抽象组件Component只定义了一个必须实现的方法,这样叶子节点Leaf,就不会去调用无关的方法,比如addChild方法

角色·:

抽象根节点:Component

分支节点:Composite

叶子结点:Leaf

案例:一个公司有两个部门行政部和开发部

行政部

  后勤部

  人力部

开发部

  java开发

  python开发

  c开发

 

抽象根节点:

public interface ICompany {

    void printDeptName();

}

树枝节点:

public class Composite  implements ICompany{

    private List<ICompany> list = new ArrayList<>();

    private String name;
    private Integer level;

    public Composite(String name, Integer level) {
        list.add(new Dept(name));
        this.name = name;
        this.level = level;
    }

    public void addDept(ICompany icompany){
        list.add(icompany);
    }
    public  void  addAllDept(List<Dept> deptList){
        for (Dept dept : deptList) {
            list.add(dept);
        }
    }

    @Override
    public void printDeptName() {
        for (int i = 0; i <list.size() ; i++) {
            if( i == 0){
                System.out.println("");
            }else{
                System.out.print("---");
            }
            list.get(i).printDeptName();
        }
    }
}

叶子结点

public class Dept implements ICompany{

    private String name;

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

    public String getName() {
        return name;
    }

    @Override
    public void printDeptName() {
        System.out.println(name);
    }
}

测试:

public class Test {
    public static void main(String[] args) {
        Dept dept1 =  new Dept("行政部");
        Dept dept2 =  new Dept("人力部");
        Dept dept3 =  new Dept("后勤部");

        Dept dept4 =  new Dept("开发部");
        Dept dept5 =  new Dept("java开发部");
        Dept dept6 =  new Dept("python开发部");
        Dept dept7 =  new Dept("c开发部");

        Composite composite = new Composite(dept1.getName(),2);
        composite.addDept(dept2);
        composite.addDept(dept3);
        composite.printDeptName();

        System.out.println("_____________________________________");

        Composite composite2 = new Composite(dept4.getName(),2);
        List<Dept> deptList = new ArrayList<>();
        deptList.add(dept5);
        deptList.add(dept6);
        deptList.add(dept7);
        composite2.addAllDept(deptList);
        composite2.printDeptName();
    }
}

输出:

行政部
---人力部
---后勤部
_____________________________________

开发部
---java开发部
---python开发部
---c开发部

优点:

1、可以清晰的分层

2、符合开闭原则

3、简化客户端代码

标签:java,name,Composite,十二,Dept,开发部,new,设计模式,public
来源: https://www.cnblogs.com/tdyang/p/13280558.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有