GP Coder

Trang chia sẻ kiến thức lập trình Java

  • Java Core
    • Basic Java
    • OOP
    • Exception Handling
    • Multi-Thread
    • Java I/O
    • Networking
    • Reflection
    • Collection
    • Java 8
  • Design pattern
    • Creational Pattern
    • Structuaral Pattern
    • Behavior Pattern
  • Web Service
    • SOAP
    • REST
  • JPA
  • Java library
    • Report
    • Json
    • Unit Test
  • Message Queue
    • ActiveMQ
    • RabbitMQ
  • All
Trang chủ Design pattern Structuaral Pattern Hướng dẫn Java Design Pattern – Composite

Hướng dẫn Java Design Pattern – Composite

Đăng vào 02/11/2018 . Được đăng bởi GP Coder . 37393 Lượt xem . Toàn màn hình

Trong các bài viết trước chúng ta đã tìm hiểu về Bridge Pattern và Adapter Pattern. Trong bài viết này chúng ta tiếp tục tìm hiểu một Design Pattern khác thuộc nhóm cấu trúc là Composite Pattern.

Nội dung

  • 1 Composite Pattern là gì?
  • 2 Cài đặt Composite Pattern như thế nào?
  • 3 Lợi ích của Composite Pattern là gì?
  • 4 Sử dụng Composite Pattern khi nào?

Composite Pattern là gì?

Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly.

Composite là một mẫu thiết kế thuộc nhóm cấu trúc (Structural Pattern). Composite Pattern là một sự tổng hợp những thành phần có quan hệ với nhau để tạo ra thành phần lớn hơn. Nó cho phép thực hiện các tương tác với tất cả đối tượng trong mẫu tương tự nhau.

Composite Pattern được sử dụng khi chúng ta cần xử lý một nhóm đối tượng tương tự theo cách xử lý 1 object. Composite pattern sắp xếp các object theo cấu trúc cây để diễn giải 1 phần cũng như toàn bộ hệ thống phân cấp. Pattern này tạo một lớp chứa nhóm đối tượng của riêng nó. Lớp này cung cấp các cách để sửa đổi nhóm của cùng 1 object. Pattern này cho phép Client có thể viết code giống nhau để tương tác với composite object này, bất kể đó là một đối tượng riêng lẻ hay tập hợp các đối tượng.

Ví dụ: Một chương trình quản lý một hệ thống tập tin với cấu trúc như hình sau:

Một hệ thống tập tin là một cấu trúc cây có chứa các nhánh là các thư mục (folder – composite), cũng như các nút lá là các tệp (file – leaf). Một folder có thể chứa một hoặc nhiều file hoặc folder. Do đó, folder là một đối tượng phức tạp và file là một đối tượng đơn giản. File và Folder có nhiều thao tác và thuộc tính chung, chẳng hạn như: di chuyển (cut) , sao chép (copy), liệt kê (view) hoặc các thuộc tính thư mục như tên tệp và kích thước.

Với cấu trúc như vậy sẽ dễ dàng và thuận tiện hơn để quản lý file và folder thống nhất bằng cách xây dựng một Interface có đầy đủ các phương thức và thuộc tính chung cho cả file và folder.

Cài đặt Composite Pattern như thế nào?

Một Composite Pattern bao gồm các thành phần cơ bản sau:

  • Base Component : là một interface hoặc abstract class quy định các method chung cần phải có cho tất cả các thành phần tham gia vào mẫu này.
  • Leaf : là lớp hiện thực (implements) các phương thức của Component. Nó là các object không có con.
  • Composite : lưu trữ tập hợp các Leaf và cài đặt các phương thức của Base Component. Composite cài đặt các phương thức được định nghĩa trong interface Component bằng cách ủy nhiệm cho các thành phần con xử lý.
  • Client: sử dụng Base Component để làm việc với các đối tượng trong Composite.

Ví dụ: Cài đặt Composite Pattern về chương trình quản lý một hệ thống tập tin ở trên.

  • Trước hết chúng ta định nghĩa một Inteface Component (FileComponent) có các phương thức chung cho cả folder và file. Để đơn giản, tôi chỉ tạo 2 phương thức showProperty() và totalSize(). Hai phương thức này sẽ cung cấp thông tin về file và tổng kích thước của nó.
  • Tiếp theo, chúng ta sẽ tạo một class Leaf cài đặt các phương thức của Component (FileLeaf). Một class Composite chứa tập hợp các Leaf và cài đặt các phương thức của Component (FolderComposite).
  • Cuối cùng, chúng ta sẽ tạo một class Client gọi các phương thức của FileComponent và FolderComposite. Cách gọi các phương thức của 2 class này hoàn toàn giống nhau do cùng implement một Component (FileComponent).

FileComponent.java


package com.gpcoder.patterns.structural.composite;

public interface FileComponent {
	void showProperty();
	long totalSize();
}

FileLeaf.java


package com.gpcoder.patterns.structural.composite;

public class FileLeaf implements FileComponent {

	private String name;
	private long size;

	public FileLeaf(String name, long size) {
		super();
		this.name = name;
		this.size = size;
	}

	@Override
	public long totalSize() {
		return size;
	}

	@Override
	public void showProperty() {
		System.out.println("FileLeaf [name=" + name + ", size=" + size + "]");
	}
}

FolderComposite.java


package com.gpcoder.patterns.structural.composite;

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

public class FolderComposite implements FileComponent {

	private List<FileComponent> files = new ArrayList<>();

	public FolderComposite(List<FileComponent> files) {
		this.files = files;
	}

	@Override
	public void showProperty() {
		for (FileComponent file : files) {
			file.showProperty();
		}
	}

	@Override
	public long totalSize() {
		long total = 0;
		for (FileComponent file : files) {
			total += file.totalSize();
		}
		return total;
	}
}

Client.java


package com.gpcoder.patterns.structural.composite;

import java.util.Arrays;
import java.util.List;

public class Client {

	public static void main(String[] args) {
		FileComponent file1 = new FileLeaf("file 1", 10);
		FileComponent file2 = new FileLeaf("file 2", 5);
		FileComponent file3 = new FileLeaf("file 3", 12);

		List<FileComponent> files = Arrays.asList(file1, file2, file3);
		FileComponent folder = new FolderComposite(files);
		folder.showProperty();
		System.out.println("Total Size: " + folder.totalSize());
	}
}

Output của chương trình trên:


FileLeaf [name=file 1, size=10]
FileLeaf [name=file 2, size=5]
FileLeaf [name=file 3, size=12]
Total Size: 27

Lợi ích của Composite Pattern là gì?

  • Cung cấp cùng một cách sử dụng đối với từng đối tượng riêng lẻ hoặc nhóm các đối tượng với nhau.

Sử dụng Composite Pattern khi nào?

  • Composite Pattern chỉ nên được áp dụng khi nhóm đối tượng phải hoạt động như một đối tượng duy nhất (theo cùng một cách).
  • Composite Pattern có thể được sử dụng để tạo ra một cấu trúc giống như cấu trúc cây.

Tài liệu tham khảo:

  • https://sourcemaking.com/design_patterns/composite
  • https://refactoring.guru/design-patterns/composite
  • https://www.tutorialspoint.com/design_pattern/composite_pattern.htm
  • https://www.javatpoint.com/composite-pattern
  • https://vi.wikipedia.org/wiki/Composite_pattern
  • https://www.journaldev.com/1535/composite-design-pattern-in-java
4.8
23
Nếu bạn thấy hay thì hãy chia sẻ bài viết cho mọi người nhé! Và Donate tác giả

Shares

Chuyên mục: Design pattern, Structuaral Pattern Được gắn thẻ: Design pattern, Structuaral Pattern

Hướng dẫn Java Design Pattern – Bridge
Hướng dẫn Java Design Pattern – Decorator

Có thể bạn muốn xem:

  • Giới thiệu Google Guice – Dependency injection (DI) framework (04/02/2019)
  • Refactoring Design Pattern với tính năng mới trong Java 8 (26/09/2019)
  • Hướng dẫn Java Design Pattern – Flyweight (22/11/2018)
  • Giới thiệu Google Guice – Binding (05/02/2019)
  • Hướng dẫn Java Design Pattern – Null Object (13/01/2019)

Bình luận

bình luận

Tìm kiếm

Bài viết mới

  • Clean code 13/01/2024
  • Giới thiệu CloudAMQP – Một RabbitMQ server trên Cloud 02/10/2020
  • Kết nối RabbitMQ sử dụng Web STOMP Plugin 19/06/2020
  • Sử dụng publisher confirm trong RabbitMQ 16/06/2020
  • Sử dụng Dead Letter Exchange trong RabbitMQ 13/06/2020

Xem nhiều

  • Hướng dẫn Java Design Pattern – Factory Method (98278 lượt xem)
  • Hướng dẫn Java Design Pattern – Singleton (97905 lượt xem)
  • Giới thiệu Design Patterns (88146 lượt xem)
  • Lập trình đa luồng trong Java (Java Multi-threading) (86720 lượt xem)
  • Giới thiệu về Stream API trong Java 8 (84081 lượt xem)

Nội dung bài viết

  • 1 Composite Pattern là gì?
  • 2 Cài đặt Composite Pattern như thế nào?
  • 3 Lợi ích của Composite Pattern là gì?
  • 4 Sử dụng Composite Pattern khi nào?

Lưu trữ

Thẻ đánh dấu

Annotation Authentication Basic Java Behavior Pattern Collection Creational Design Pattern Cấu trúc điều khiển Database Dependency Injection Design pattern Eclipse Exception Executor Service Google Guice Gson Hibernate How to Interceptor IO Jackson Java 8 Java Core JDBC JDK Jersey JMS JPA json JUnit JWT Message Queue Mockito Multithreading OOP PowerMockito RabbitMQ Reflection Report REST SOAP Structuaral Pattern Swagger Thread Pool Unit Test Webservice

Liên kết

  • Clean Code
  • JavaTpoint
  • Refactoring Guru
  • Source Making
  • TutorialsPoint
  • W3Schools Online Web Tutorials

Giới thiệu

GP Coder là trang web cá nhân, được thành lập với mục đích lưu trữ, chia sẽ kiến thức đã học và làm việc của tôi. Các bài viết trên trang này chủ yếu về ngôn ngữ Java và các công nghệ có liên quan đến Java như: Spring, JSF, Web Services, Unit Test, Hibernate, SQL, ...
Hi vọng góp được chút ít công sức cho sự phát triển cộng đồng Coder Việt.

Donate tác giả

Tìm kiếm các bài viết của GP Coder với Google Search

Liên hệ

Các bạn có thể liên hệ với tôi thông qua:
  • Trang liên hệ
  • Linkedin: gpcoder
  • Email: contact@gpcoder.com
  • Skype: ptgiang56it

Follow me

Copyright 2025 © GP Coder · All Rights Reserved · Giới thiệu · Chính sách · Điều khoản · Liên hệ ·

Share

Blogger
Delicious
Digg
Email
Facebook
Facebook messenger
Flipboard
Google
Hacker News
Line
LinkedIn
Mastodon
Mix
Odnoklassniki
PDF
Pinterest
Pocket
Print
Reddit
Renren
Short link
SMS
Skype
Telegram
Tumblr
Twitter
VKontakte
wechat
Weibo
WhatsApp
X
Xing
Yahoo! Mail

Copy short link

Copy link