Composite Design Pattern in Java--转
https://dzone.com/articles/composite-design-pattern-in-java-1
The composite pattern is meant to "compose objects into a tree structure to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly"
- Composite design patterns describe groups of objects that can be treated in the same way as a single instance of the same object type.
- The composite pattern allows us to "compose" objects into tree structures to represent part-whole hierarchies.
- In addition, the composite patterns also allow our clients to treat individual objects and compositions in the same way.
- Composite patterns allow us to have a tree structure for each node that performs a task.
- In object-oriented programming, a composite is an object designed as a composition of one-or-more similar objects, all exhibiting similar functionality. This is known as a “has-a”relationship between objects.
Below is the list of classes/objects used in the composite pattern, which has four :
- Component – Component is the interface (or abstract class) for the composition of the objects and methods for accessing/processing its child or node components. It also implements a default interface to define common functionalities/behaviors for all component classes.
- Leaf – The leaf class defines a concrete component class, which does not have any further composition. The leaf class implements the component interface. It performs the command/task at its end only.
- Composite – The composite class defines a concrete component class, which stores its child components. The composite class implements the component interface. It forwards the command/task to the composite objects it contains. It may also perform additional operations before and after forwarding the command/task.
- Client – The client class uses the component interface to interact/manipulate the objects in the composition (Leaf and Composite).
To better understand this, let's take a look at an example of employees working in an organization.
Steps
- We create an interface to define functionalities we like to perform as composite and leaf objects. Below is the code of the
Work
interface, which has methods forassignWork()
andperformWork()
. TheWork
interface will act as a component of the composite pattern in the example.
package design.composite;
public interface Work {
void assignWork(Employee manager, String work);
void performWork();
}
- We will create an abstract class of
Employee
to carry the common code for all various concrete subclasses of the employees.
package design.composite;
public abstract class Employee implements Work {
protected long employeeId;
protected String employeeName;
protected String designation;
protected Department department;
public Employee(long employeeId, String employeeName, String designation, Department department) {
super();
this.employeeId = employeeId;
this.employeeName = employeeName;
this.designation = designation;
this.department = department;
}
public long getEmployeeId() {
return employeeId;
}
public void setEmployeeId(long employeeId) {
this.employeeId = employeeId;
}
public String getEmployeeName() {
return employeeName;
}
public void setEmployeeName(String employeeName) {
this.employeeName = employeeName;
}
public String getDesignation() {
return designation;
}
public void setDesignation(String designation) {
this.designation = designation;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("Employee [").append(employeeId)
.append(", ").append(employeeName)
.append(", ").append(Designation)
.append(", ").append(department)
.append("]");
return builder.toString();
}
}
- Now, we will create two concrete subclasses of the
Employee
—Manager
andEngineer
. For this, I am keeping the example simple to keep a focus on the pattern. - We will create the
Engineer
class to use as theLeaf
object and, hence, does not have any other employee object as a reference via composition.
package design.composite;
public class Engineer extends Employee {
private String work;
public Engineer(long employeeId, String employeeName, String designation, Department department) {
super(employeeId, employeeName, designation, department);
}
@Override
public void assignWork(Employee manager, String work) {
this.work = work;
System.out.println(this + " has assigned work of '" + work + "' by manager " + manager);
}
@Override
public void performWork() {
System.out.println(this + " is performing work of '" + work + "'");
}
}
- We will create the
Manager
class to use as the composite object, and we will have another Employee object as a collection via the composition.
package design.composite;
import java.util.ArrayList;
import java.util.List;
public class Manager extends Employee {
protected List<Employee> managingEmployees = new ArrayList<Employee>();
public Manager(long employeeId, String employeeName, String designation, Department department) {
super(employeeId, employeeName, designation, department);
}
public boolean manages(Employee employee) {
return managingEmployees.add(employee);
}
public boolean stopManaging(Employee employee) {
return managingEmployees.remove(employee);
}
@Override
public void assignWork(Employee manager, String work) {
System.out.println(this + " has assigned work of '" + work + "' by manager " + manager);
System.out.println();
System.out.println(this + " distributing work '" + work + "' to managing-employees..");
managingEmployees.stream().forEach(employee -> {
System.out.println("Assigning to " + employee);
employee.assignWork(this, work);
});
System.out.println();
System.out.println(this + " distributed work of '" + work + "'");
System.out.println();
}
@Override
public void performWork() {
System.out.println(this + " is asking his managing employees to perfom assigned work");
System.out.println();
managingEmployees.stream().forEach(employee -> employee.performWork());
System.out.println();
System.out.println(this + " has completed assigned work with the help of his manahging employees");
System.out.println();
}
}
- In the end, we will write the
Main
class as theClien
to execute and test our composite pattern code.
package design.composite;
public class Main {
public static void main(String[] args) {
Engineer ajay = new Engineer(1001l, "Ajay", "Developer", Department.ENG);
Engineer vijay = new Engineer(1002l, "Vijay", "SR. Developer", Department.ENG);
Engineer jay = new Engineer(1003l, "Jay", "Lead", Department.ENG);
Engineer martin = new Engineer(1004l, "Martin", "QA", Department.ENG);
Manager kim = new Manager(1005l, "Kim", "Manager", Department.ENG);
Engineer anders = new Engineer(1006l, "Andersen", "Developer", Department.ENG);
Manager niels = new Manager(1007l, "Niels", "Sr. Manager", Department.ENG);
Engineer robert = new Engineer(1008l, "Robert", "Developer", Department.ENG);
Manager rachelle = new Manager(1009l, "Rachelle", "Product Manager", Department.ENG);
Engineer shailesh = new Engineer(1010l, "Shailesh", "Engineer", Department.ENG);
kim.manages(ajay);
kim.manages(martin);
kim.manages(vijay);
niels.manages(jay);
niels.manages(anders);
niels.manages(shailesh);
rachelle.manages(kim);
rachelle.manages(robert);
rachelle.manages(niels);
rachelle.assignWork(rachelle, "develop web-service code for Product Catalogue");
rachelle.performWork();
}
}
- Below is the output of the program:
Employee [1009, Rachelle, Product Manager, ENG] has assigned work of 'develop web-service code for Product Catalogue' by manager Employee [1009, Rachelle, Product Manager, ENG]
Employee [1009, Rachelle, Product Manager, ENG] distributing work 'develop web-service code for Product Catalogue' to managing-employees..
Assigning to Employee [1005, Kim, Manager, ENG]
Employee [1005, Kim, Manager, ENG] has assigned work of 'develop web-service code for Product Catalogue' by manager Employee [1009, Rachelle, Product Manager, ENG]
Employee [1005, Kim, Manager, ENG] distributing work 'develop web-service code for Product Catalogue' to managing-employees..
Assigning to Employee [1001, Ajay, Developer, ENG]
Employee [1001, Ajay, Developer, ENG] has assigned work of 'develop web-service code for Product Catalogue' by manager Employee [1005, Kim, Manager, ENG]
Assigning to Employee [1004, Martin, QA, ENG]
Employee [1004, Martin, QA, ENG] has assigned work of 'develop web-service code for Product Catalogue' by manager Employee [1005, Kim, Manager, ENG]
Assigning to Employee [1002, Vijay, SR. Developer, ENG]
Employee [1002, Vijay, SR. Developer, ENG] has assigned work of 'develop web-service code for Product Catalogue' by manager Employee [1005, Kim, Manager, ENG]
Employee [1005, Kim, Manager, ENG] distributed work of 'develop web-service code for Product Catalogue'
Assigning to Employee [1008, Robert, Developer, ENG]
Employee [1008, Robert, Developer, ENG] has assigned work of 'develop web-service code for Product Catalogue' by manager Employee [1009, Rachelle, Product Manager, ENG]
Assigning to Employee [1007, Niels, Sr. Manager, ENG]
Employee [1007, Niels, Sr. Manager, ENG] has assigned work of 'develop web-service code for Product Catalogue' by manager Employee [1009, Rachelle, Product Manager, ENG]
Employee [1007, Niels, Sr. Manager, ENG] distributing work 'develop web-service code for Product Catalogue' to managing-employees..
Assigning to Employee [1003, Jay, Lead, ENG]
Employee [1003, Jay, Lead, ENG] has assigned work of 'develop web-service code for Product Catalogue' by manager Employee [1007, Niels, Sr. Manager, ENG]
Assigning to Employee [1006, Andersen, Developer, ENG]
Employee [1006, Andersen, Developer, ENG] has assigned work of 'develop web-service code for Product Catalogue' by manager Employee [1007, Niels, Sr. Manager, ENG]
Assigning to Employee [1010, Shailesh, Engineer, ENG]
Employee [1010, Shailesh, Engineer, ENG] has assigned work of 'develop web-service code for Product Catalogue' by manager Employee [1007, Niels, Sr. Manager, ENG]
Employee [1007, Niels, Sr. Manager, ENG] distributed work of 'develop web-service code for Product Catalogue'
Employee [1009, Rachelle, Product Manager, ENG] distributed work of 'develop web-service code for Product Catalogue'
Employee [1009, Rachelle, Product Manager, ENG] is asking his managing employees to perfom assigned work
Employee [1005, Kim, Manager, ENG] is asking his managing employees to perfom assigned work
Employee [1001, Ajay, Developer, ENG] is performing work of 'develop web-service code for Product Catalogue'
Employee [1004, Martin, QA, ENG] is performing work of 'develop web-service code for Product Catalogue'
Employee [1002, Vijay, SR. Developer, ENG] is performing work of 'develop web-service code for Product Catalogue'
Employee [1005, Kim, Manager, ENG] has completed assigned work with the help of his manahging employees
Employee [1008, Robert, Developer, ENG] is performing work of 'develop web-service code for Product Catalogue'
Employee [1007, Niels, Sr. Manager, ENG] is asking his managing employees to perfom assigned work
Employee [1003, Jay, Lead, ENG] is performing work of 'develop web-service code for Product Catalogue'
Employee [1006, Andersen, Developer, ENG] is performing work of 'develop web-service code for Product Catalogue'
Employee [1010, Shailesh, Engineer, ENG] is performing work of 'develop web-service code for Product Catalogue'
Employee [1007, Niels, Sr. Manager, ENG] has completed assigned work with the help of his manahging employees
Employee [1009, Rachelle, Product Manager, ENG] has completed assigned work with the help of his manahging employees
Composite Design Pattern in Java--转的更多相关文章
- Template Method Design Pattern in Java
Template Method is a behavioral design pattern and it’s used to create a method stub and deferring s ...
- Composite Design Pattern 设计模式组合
设计模式组合,它能够更类组合在一类,形成一个树状结构. #include <set> #include <iostream> #include <string> u ...
- Chain Of Responsibility Design Pattern Example
Avoid coupling the sender of a request to the receiver by giving more than one object a chance to ha ...
- Design Pattern - Service Locator Pattern--转载
原文地址:http://www.tutorialspoint.com/design_pattern/service_locator_pattern.htm The service locator de ...
- java设计模式大全 Design pattern samples in Java(最经典最全的资料)
java设计模式大全 Design pattern samples in Java(最经典最全的资料) 2015年06月19日 13:10:58 阅读数:11100 Design pattern sa ...
- [Java] Design Pattern:Code Shape - manage your code shape
[Java] Design Pattern:Code Shape - manage your code shape Code Shape Design Pattern Here I will intr ...
- java design pattern - adapter pattern
场景 适配器模式 总结 参考资料 场景 在编程中我们经常会遇到驴头不对马嘴的情况,比如以前是继承A的接口的对象,现在外部调用的时候需要该对象已B接口的形式来调用 ,这个时候我们可以让对象同时集成A和B ...
- [转]Design Pattern Interview Questions - Part 4
Bridge Pattern, Composite Pattern, Decorator Pattern, Facade Pattern, COR Pattern, Proxy Pattern, te ...
- [转]Design Pattern Interview Questions - Part 1
Factory, Abstract factory, prototype pattern (B) What are design patterns? (A) Can you explain facto ...
随机推荐
- C#ADO.NET基础二
DataAdapter的使用,批量增删改 1.使用DataAdapter查询 private void Select2() { try { using (SQLiteConnection conn = ...
- 微信Token验证
/// <summary> /// 微信验证 /// </summary> /// <param name="echostr"></par ...
- Winform中的DatagridView显示行号
1.设置 RowPostPaint 为true 2.启用RowPostPaint事件 /// <summary> /// DataGridView显示行号 /// </summary ...
- asp.netcore+jenkins+docker+svn+centos7.2 持续集成,每天凌晨获取最新代码打包发布
运行环境: centos7.2服务器或则虚拟机 可以是腾讯云也可以是内网服务器,(如果是内网服务器需要用frp做内网穿透,这样才可以通过外网访问该服务器) svnserver 来托管代码 一.安装je ...
- asp.net mvc 请求处理流程,记录一下。
asp.net mvc 请求处理流程,记录一下.
- hive默认分隔符
默认分隔符‘\001',对应ascii码SOH: 通过cat -A filename可以查看分隔符:
- 51nod1228 序列求和(伯努利数)
题面 传送门 题解 \(O(n^2)\)预处理伯努利数 不知道伯努利数是什么的可以看看这篇文章 不过这个数据范围拉格朗日差值应该也没问题--吧--大概-- //minamoto #include< ...
- linux防火墙(一)—— iptables架构介绍
一.防火墙的分类 一般宏观来说,防火墙分为主机型防火墙,例如我们为了防止个人电脑被攻击,而开启的防火墙,还分为网关型防火墙,一般部署在企业的网关,用于过滤和转发,保证整个企业的网络环境安全性. 按照物 ...
- The server of Apache (一)——apache服务的基本安装过程
一.为了避免端口冲突,需要卸载linux系统中以RPM方式安装的httpd ~] # rpm -qa | grep httpd ~] # rpm -e httpd --nodeps (此处nodeps ...
- 关于运行robot framework 报错解决方法,ModuleNotFoundError: No module named 'robot'
报错: command: pybot.bat --argumentfile c:\users\76776\appdata\local\temp\RIDEiw0utf.d\argfile.txt --l ...