Combination mode of design mode (11)

What is composite mode

The Composite pattern is a structural design pattern that aims to treat container and content as the same thing even if the container and content are consistent. Both the content and the container can be placed in the container to form a recursive structure.

example

Construct the company's organizational structure tree

Node node

package StructuralPattern.CompositeMode;

import java.util.List;

/**
 * Node节点
 */
public interface Node {
    
    
    /**
     * 增加一个子节点
     * @param node
     * @return
     */
    Node add(Node node);

    /**
     * 获取所有子节点
     * @return
     */
    List<Node> listChildren();

    /**
     * 打印结构
     * @return
     */
    String print();
}

Organization
has content name and container list

package StructuralPattern.CompositeMode;

import java.util.ArrayList;
import java.util.List;

/**
 * 组织
 */

public class Organization implements Node {
    
    
    private String name;

    private List<Node> list;
	
	/**
	* 层次
	*/
    private int floor;

    public Organization(String name,int floor) {
    
    
        list = new ArrayList<>();
        this.name = name;
        this.floor = floor;
    }

    @Override
    public Node add(Node node) {
    
    
        list.add(node);
        return this;
    }

    @Override
    public List<Node> listChildren() {
    
    
        return list;
    }

    @Override
    public String print() {
    
    
        StringBuilder res = new StringBuilder();
        res.append("    ".repeat(Math.max(0, floor)));
        res.append("organization: ").append(name).append('\n');
        list.forEach(l->{
    
    
            res.append(l.print());
        });
        return res.toString();
    }
}

Department

package StructuralPattern.CompositeMode;

import java.util.ArrayList;
import java.util.List;

/**
 * 部门
 */

public class Department implements Node{
    
    
    private String name;

    private List<Node> list;

    /**
     * 层次
     */
    private int floor;

    public Department(String name,int floor){
    
    
        list = new ArrayList<>();
        this.name = name;
        this.floor = floor;
    }

    @Override
    public Node add(Node node) {
    
    
        list.add(node);
        return this;
    }

    @Override
    public List<Node> listChildren() {
    
    
        return list;
    }

    @Override
    public String print() {
    
    
        StringBuilder res = new StringBuilder();
        res.append("    ".repeat(Math.max(0, floor)));
        res.append("department: ").append(name).append('\n');
        list.forEach(l->{
    
    
            res.append(l.print());
        });
        return res.toString();
    }
}

Employee

package StructuralPattern.CompositeMode;

import java.util.ArrayList;
import java.util.List;

/**
 * 员工
 */

public class Employee implements Node{
    
    
    private String name;

    private List<Node> list;

    /**
     * 层次
     */
    private int floor;

    public Employee(String name,int floor){
    
    
        list = new ArrayList<>();
        this.name = name;
        this.floor = floor;
    }

    @Override
    public Node add(Node node) {
    
    
        throw new UnsupportedOperationException();
    }

    @Override
    public List<Node> listChildren() {
    
    
        return list;
    }

    @Override
    public String print() {
    
    
        StringBuilder res = new StringBuilder();
        res.append("    ".repeat(Math.max(0, floor)));
        res.append("Employee: ").append(name).append('\n');
        return res.toString();
    }
}

Main

package StructuralPattern.CompositeMode;

/**
 * Main
 */

public class Main {
    
    
    public static void main(String[] args) {
    
    
        Node company = new Organization("xxx有限公司",0);

        Department depart1 = new Department("信息部",1);
        Department depart2 = new Department("研发部",1);
        Department depart3 = new Department("软件开发部",2);

        depart3.add(new Employee("five",3))
                .add(new Employee("six",3));
        depart2.add(new Employee("four",2)).add(depart3);
        depart1.add(new Employee("one",1))
                .add(new Employee("two",1))
                .add(new Employee("three",1));
        company.add(depart1).add(depart2);
        System.out.println(company.print());
    }
}

result
insert image description here

Summarize

The Composite mode makes content objects and container objects consistent, thereby forming a unified tree structure and handling them in a consistent manner.

Guess you like

Origin blog.csdn.net/weixin_43636205/article/details/130133307