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
Workinterface, which has methods forassignWork()andperformWork(). TheWorkinterface 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
Employeeto 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—ManagerandEngineer. For this, I am keeping the example simple to keep a focus on the pattern. - We will create the
Engineerclass to use as theLeafobject 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
Managerclass 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
Mainclass as theCliento 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 ...
随机推荐
- [转]Marshaling a SAFEARRAY of Managed Structures by P/Invoke Part 6.
1. Introduction. 1.1 Starting from part 4 I have started to discuss how to interop marshal a managed ...
- Docker 镜像的制作和使用
镜像 Layer(层) 镜像里的内容是按「层」来组织的,「层」可以复用,一个完整的镜像也可以看做是一个「层」.多个「层」叠加在一起就形成了一个新的镜像,这个镜像也可以作为别的镜像的基础「层」进行更加复 ...
- CentOS7 搭建 python pypi 私有源
(1)寻找可用的同步源,我选择的是中科大的源:http://rsync.mirrors.ustc.edu.cn (2)创建数据同步目录:/root/pypi(如果想存放到其他目录,可以通过软链接的方式 ...
- Jmeter_Beanshell_使用Java处理JSON块
版权声明:本文为博主原创文章,转载请注明出处. [环境] ①Jmeter版本:3.2,JDK:1.8 ②前置条件:将json.jar包置于..\apache-jmeter-3.2\lib\下,并将该j ...
- 【AGC013D】Pilling Up dp
Description 红蓝球各无限多个. 初始时随意地从中选择 n 个, 扔入箱子 初始有一个空的序列 接下来依次做 m 组操作, 每组操作为依次执行下述三个步骤 (1) 从箱子中取出一个求插入序列 ...
- [Swift实际操作]九、完整实例-(1)在iTunesConnect网站中创建产品
本文将通过一个实例项目,演示移动应用开发的所有步骤.首先要做的是打开浏览器,并进入[iTunesConnect网站],需要通过它创建一款自己的应用. 在iTunesConnect的登录页面中,输入自己 ...
- 魔方方法之--类的构造(__init__,__new__)和析构(__del__)方法
构造方法(参见小甲鱼入门教程) __ init__()方法:类的初始化方法,初始化类对象时被调用,需要的时候再调用它 注意点:这个方法的返回值必须是None class Rectangle(): de ...
- 5. pytest的断言
一.pytest 支持Python自带的标准断言 def f(): return 3 def test_function(): assert f() == 4 pytest 的断言报告,也很丰富,和详 ...
- 获取 stoken 或者id MVC写法
//获取地址栏 painting_idvar painting_id = "{$_GET['painting_id']}"; var stoken = "{$_SESSI ...
- C#实现WebSocket协议客户端和服务器websocket sharp组件实例解析
看到这篇文章的题目,估计很多人都会问,这个组件是不是有些显的无聊了,说到web通信,很多人都会想到ASP.NET SignalR,或者Nodejs等等,实现web的网络实时通讯.有关于web实时通信的 ...