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 ...
随机推荐
- laravel中get方式表单提交后, 地址栏数据重复的问题
csrf_field这个要放form表单下面第一行的位置
- easyui datagrid deleteRow(删除行)的BUG
有时候想临时保存一些数据,等确定好后在批量一次提交,但EasyUI datagrid 用的时候添加可以正常,如果从中间删除那行号就全乱了.导致删除的时候有可能删除上一行数据. function ad ...
- linux虚拟机安装mysql(Mysql-5.7.10)
注:MySQL5.5版本开始弃用了常规的configure编译方法,通过cmake来编译.需要下载安装cmake编译器.boost库.ncurses库.GNU分析器生成器bison 1. 安装基础环境 ...
- 「BZOJ 2733」「HNOI 2012」永无乡「启发式合并」
题意 你需要维护若干连通快,有两个操作 合并\(x,y\)所在的连通块 询问\(x\)所在连通块中权值从小到大排第\(k\)的结点编号 题解 可以启发式合并\(splay\),感觉比较好些的 一个连通 ...
- map/fileter
一.生成器,generator,节省内存,但是增加了CPU的计算时间 (下节课讲函数怎么变成生成器) 每次循环的时候,就按照这个规则(自己定义的逻辑)去生成一个数据. res = [ 'a','1' ...
- django中itsdangerous的用法
itsdangerous用来解决什么问题,为什么需要用到itsdangerous? 安装命令:pip install itsdangerous 有时候你想向不可信的环境发送一些数据,但如何安全完成这个 ...
- delphi 给字符指针分配内存
今天,对接第三方dll的时候出现如下问题: 接口声明如下: long BL_tradeBalance (char *MerchantNumber,char *PosId,char *OperatorN ...
- Java ExecutorService 四种线程池
1.new Thread的弊端 new Thead(new Runnable(){ @Override public void run() { // TODO Auto-generated metho ...
- tornado 04 模板
一.模板 #模板就是一个HTML文件,只是其中添加了模板语法,需要服务器的渲染才能正常显示数据 #通过render可以返回一个html网页,不过那都是固定的页面,固定的数据,如果数据是不确定的,是会不 ...
- Rebranding(模拟+思维)
The name of one small but proud corporation consists of n lowercase English letters. The Corporation ...