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 ...
随机推荐
- fwrite()
注:fwrite(),fread -可对数据块读写,且数据为二进制,文本下查看为乱码,文件的打开方式为 “b*” 实例: 写入二进制数据 for (int i = 0; i < SN; i++) ...
- 如何设置linux支持上传的文件中文不乱吗
一.背景: 1.由于客户的需求,需要a链接打开的pdf文件,支持中文名称的 二.步骤 ①.查看当前编码 locale ②.编辑 vi /etc/profile 打开后结尾处添加 export LA ...
- ajax-3验证
$("#formBtn").click(function () { // var regName =/^[\u4e00-\u9fa5]{2,10}$/;//姓名只能是汉字切2-10 ...
- kali linux之漏洞扫描
发现弱点:基于端口服务扫描结果版本信息,搜索已公开的漏洞数据库 使用弱点扫描器实现漏洞管理 弱点扫描类型(扫描结果不能确定是不是准确的,应该综合对待威胁) 主动扫描:有身份验证,无身份验证 被动扫描: ...
- IIS只允许某些IP访问
1. 2. 3.访问时提示 4.设置允许访问的IP 5.指定的IP访问时没问题了,而其他的IP不允许访问
- java 复习总结
java 复习总结 命名方法 创建文件的名称应该和类的名称一致,不然会报错. 类采用首字母大写的方式来命名,如果是多个单词的类名,则每个单词首字母都大写,例如:HelloWorld . 方法采用驼峰命 ...
- luoguP2418 yyy loves OI IV
https://www.luogu.org/problemnew/show/P2418 暴力 DP 做这题只有 30 分 考虑用线段树优化这个 DP 先处理一下整个房间都膜拜一个人的情况,然后将 1 ...
- 【spring源码】bean的实例化(转载)
首先来看一段代码,看过上一节的朋友肯定对这段代码并不陌生.这一段代码诠释了Spring加载bean的完整过程,包括读取配置文件,扫描包,加载类,实例化bean,注入bean属性依赖. 上一节介绍了Sp ...
- XMLHttpRequest 与 Ajax 概要
关于XMLHttpRequest 开发者使用XMLHttpRequest对象与服务端进行交互(发送http请求.接受返回数据等),可以在不打断用户下一步操作的情况下刷新局部页面.XMLHttpRequ ...
- GCD(最大公约数)和LCM(最小公倍数)的求法
GCD(最大公约数) (1)辗转相除法(欧几里得算法)(常用) 将两个数a, b相除,如果余数c不等于0,就把b的值给a,c的值给b,直到c等于0,此时最大公约数就是b (2)更相减损术 将两个书中较 ...