Skip to content

Commit 96f4dfd

Browse files
author
htv-manhlx
committed
add facade design pattern
1 parent 4b63ede commit 96f4dfd

File tree

4 files changed

+235
-0
lines changed

4 files changed

+235
-0
lines changed
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
## Source
2+
3+
https://refactoring.guru/design-patterns/decorator
4+
5+
## Cốt lõi:
6+
7+
> Decorator là một mẫu thiết kế cấu trúc cho phép bạn đính kèm các hành vi mới vào các đối tượng bằng cách đặt những đối
8+
> tượng này vào bên trong các đối tượng bọc đặc biệt chứa các hành vi.
9+
10+
## Structure
11+
12+
![alt tag](facade.png)
13+
14+
Các bước tạo một facade
15+
16+
**1. Xác định các thành phần hệ thống:**
17+
18+
- Đầu tiên, bạn cần xác định các thành phần của hệ thống phức tạp mà bạn muốn che giấu đi sự phức tạp của chúng. Điều
19+
này có thể là một tập hợp các lớp, đối tượng hoặc các thành phần khác của hệ thống.
20+
21+
**2. Tạo một lớp Facade:**
22+
23+
- Tạo một lớp Facade mới, đóng vai trò là một giao diện thống nhất cho các thành phần của hệ thống. Lớp Facade này sẽ
24+
chứa các phương thức để tương tác với các thành phần hệ thống.
25+
26+
**3. Xác định các phương thức Facade:**
27+
28+
- Xác định các phương thức trong lớp Facade để cung cấp các dịch vụ và chức năng cho người sử dụng cuối. Mỗi phương thức
29+
trong Facade sẽ là một giao diện thống nhất để truy cập các chức năng của các thành phần hệ thống.
30+
31+
**4. Kết nối các thành phần hệ thống:**
32+
33+
- Trong lớp Facade, bạn sẽ tạo các đối tượng hoặc tham chiếu đến các thành phần cụ thể của hệ thống mà bạn muốn che
34+
giấu đi. Điều này có thể bao gồm việc tạo đối tượng hoặc khởi tạo các đối tượng từ các lớp khác trong hệ thống.
35+
36+
**5. Cài đặt phương thức Facade:**
37+
38+
- Trong các phương thức của lớp Facade, bạn sẽ triển khai mã để gọi các phương thức hoặc chức năng của các thành phần
39+
hệ thống tương ứng. Lớp Facade sẽ đóng vai trò trung gian giữa người sử dụng và các thành phần hệ thống.
40+
41+
**6. Sử dụng Facade:**
42+
43+
- Khi bạn đã triển khai lớp Facade, người sử dụng có thể sử dụng nó để truy cập các chức năng của hệ thống mà không cần
44+
quan tâm đến sự phức tạp bên trong.
45+
46+
**7. Kiểm tra và sửa lỗi:**
47+
48+
- Kiểm tra kỹ lưỡng và sửa lỗi trong mẫu thiết kế Facade để đảm bảo rằng nó hoạt động một cách đúng đắn và hiệu quả.
49+
50+
## Description
51+
52+
### Mục đích
53+
54+
Mục đích chính của mẫu thiết kế Facade (Facade Design Pattern) là cung cấp một interface đơn giản và thống nhất cho một
55+
hệ thống phức tạp, giúp che giấu đi sự phức tạp bên trong và cung cấp một cách tiếp cận dễ dàng hơn cho người sử dụng.
56+
Dưới đây là mục đích chính của mẫu thiết kế Facade:
57+
58+
1. **Che giấu sự phức tạp:** Một trong những mục đích quan trọng nhất của Facade là ẩn đi sự phức tạp của hệ thống bên
59+
trong. Hệ thống có thể được cấu tạo từ nhiều lớp, đối tượng và phương thức khác nhau, và Facade giúp người sử dụng
60+
không cần phải biết chi tiết cụ thể về cách hệ thống hoạt động.
61+
2. **Giảm sự phụ thuộc:** Facade giúp giảm sự phụ thuộc giữa các thành phần khác nhau của hệ thống. Thay vì các thành phần
62+
phải tương tác trực tiếp với nhau, chúng tương tác thông qua lớp Facade, điều này làm giảm mức độ phụ thuộc và làm
63+
cho hệ thống dễ dàng bảo trì và mở rộng.
64+
3. **Cung cấp giao diện thống nhất:** Facade cung cấp một giao diện thống nhất cho người sử dụng để truy cập các chức năng
65+
của hệ thống. Điều này làm cho việc sử dụng hệ thống trở nên dễ dàng hơn và giúp đảm bảo tính thống nhất trong cách
66+
người sử dụng tương tác với hệ thống.
67+
4. **Cải thiện tính module và bảo trì:** Mẫu thiết kế Facade giúp tạo ra một lớp trung gian cho các tác vụ phức tạp, giúp dễ
68+
dàng quản lý mã nguồn và bảo trì hệ thống. Việc thay đổi bên trong hệ thống không cần phải ảnh hưởng đến người sử
69+
dụng lớp Facade.
70+
5. **Cải thiện sự bảo mật:** Bằng cách che giấu chi tiết cụ thể của hệ thống, Facade có thể giúp kiểm soát quyền truy cập
71+
đến các chức năng cụ thể và cung cấp một lớp bảo vệ cho hệ thống.
72+
73+
## Khi nào thì sử dụng facade
74+
75+
1. **Khi hệ thống có sự phức tạp:** Khi hệ thống của bạn có nhiều lớp, đối tượng hoặc chức năng phức tạp và bạn muốn
76+
cung cấp một giao diện đơn giản để che giấu sự phức tạp đó.
77+
78+
2. **Khi bạn muốn giảm sự phụ thuộc:** Khi bạn muốn giảm sự phụ thuộc giữa các thành phần khác nhau của hệ thống, mà
79+
không cần phải sử dụng trực tiếp các phương thức hoặc lớp của chúng.
80+
81+
3. **Khi bạn muốn tạo một giao diện thống nhất:** Khi bạn muốn cung cấp một giao diện thống nhất cho người sử dụng để
82+
truy cập các chức năng của hệ thống mà không cần biết chi tiết cụ thể của từng thành phần.
83+
84+
4. **Khi bạn muốn cải thiện tính module và bảo trì:** Mẫu thiết kế Facade giúp tạo ra một lớp trung gian cho các tác vụ
85+
phức tạp, giúp dễ dàng bảo trì và quản lý mã nguồn.
86+
87+
5. **Khi bạn muốn cải thiện sự bảo mật:** Bằng cách che giấu chi tiết cụ thể của hệ thống, bạn có thể cung cấp một lớp
88+
bảo vệ để kiểm soát quyền truy cập đến các chức năng cụ thể.
89+
90+
6. **Khi bạn làm việc với một thư viện hoặc framework mà bạn không muốn tiếp xúc trực tiếp:** Trong trường hợp bạn sử
91+
dụng một thư viện hoặc framework có sự phức tạp, bạn có thể sử dụng Facade để che giấu sự phức tạp của thư viện đó và
92+
chỉ cung cấp một giao diện dễ sử dụng cho ứng dụng của bạn.
93+
94+
7. **Khi bạn muốn tạo lớp trung gian cho các dịch vụ ngoại vi:** Facade cũng có thể được sử dụng để tạo một lớp trung
95+
gian cho việc tương tác với các dịch vụ ngoại vi như cơ sở dữ liệu, giao tiếp mạng, hoặc bất kỳ hệ thống ngoại vi nào
96+
khác
97+
98+
## Running
99+
100+
```
101+
python main.py
102+
python example.py
103+
```
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
## Source
2+
3+
https://refactoring.guru/design-patterns/facade
4+
5+
### Important:
6+
7+
> 1. Facade is a structural design pattern that provides a simplified interface to a library, a framework, or any other
8+
complex set of classes.
9+
> 2. A single class that represents an entire subsystem
10+
11+
## Description
12+
13+
## Structure
14+
15+
![alt tag](facade.png)
16+
17+
## How to use
18+
19+
1. Use the Facade pattern when you need to have a limited but straightforward interface to a complex subsystem.
20+
2. Use the Facade when you want to structure a subsystem into layers.
21+
22+
## How to implement
23+
24+
https://refactoring.guru/design-patterns/facade#checklist
25+
26+
## Running
27+
28+
```
29+
python main.py
30+
python example.py
31+
```
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
class File:
2+
def __init__(self, file):
3+
self.filename = file
4+
5+
6+
class VideoFile:
7+
def __init__(self, filename):
8+
self.filename = filename
9+
10+
11+
class OggCompressionCodec:
12+
pass
13+
14+
15+
class MPEG4CompressionCodec:
16+
pass
17+
18+
19+
class CodecFactory:
20+
21+
@staticmethod
22+
def extract(file):
23+
pass
24+
25+
26+
class BitrateReader:
27+
@staticmethod
28+
def read(filename, source_codec):
29+
pass
30+
31+
@staticmethod
32+
def convert(buffer, destination_codec):
33+
pass
34+
35+
36+
class AudioMixer:
37+
@staticmethod
38+
def fix(result):
39+
pass
40+
41+
42+
class VideoConverter:
43+
def convert(self, filename, format):
44+
file = VideoFile(filename)
45+
source_codec = CodecFactory.extract(file)
46+
47+
if format == "mp4":
48+
destination_codec = MPEG4CompressionCodec()
49+
else:
50+
destination_codec = OggCompressionCodec()
51+
52+
buffer = BitrateReader.read(filename, source_codec)
53+
result = BitrateReader.convert(buffer, destination_codec)
54+
result = (AudioMixer().fix(result))
55+
return File(result)
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
class Facade:
2+
def __init__(self, subsystem1, subsystem2):
3+
self._subsystem1 = subsystem1 or Subsystem1()
4+
self._subsystem2 = subsystem2 or Subsystem2()
5+
6+
def operation(self):
7+
results = []
8+
results.append('Facade initializes subsystems:')
9+
results.append(self._subsystem1.operation1())
10+
results.append(self._subsystem2.operation1())
11+
results.append('Facade orders subsystems to perform the action:')
12+
results.append(self._subsystem1.operation_n())
13+
results.append(self._subsystem2.operation_z())
14+
return '\n'.join(results)
15+
16+
17+
class Subsystem1:
18+
def operation1(self):
19+
return 'Subsystem1: Ready!'
20+
21+
def operation_n(self):
22+
return 'Subsystem1: Go!'
23+
24+
25+
class Subsystem2:
26+
def operation1(self):
27+
return 'Subsystem2: Get ready!'
28+
29+
def operation_z(self):
30+
return 'Subsystem2: Fire!'
31+
32+
33+
class ClientCode:
34+
def __init__(self, facade):
35+
self._facade = facade
36+
37+
def operation(self):
38+
print(self._facade.operation())
39+
40+
41+
if __name__ == '__main__':
42+
subsystem1 = Subsystem1()
43+
subsystem2 = Subsystem2()
44+
facade = Facade(subsystem1, subsystem2)
45+
client = ClientCode(facade)
46+
client.operation()

0 commit comments

Comments
 (0)