퍼사드 패턴이란?
- 복잡한 서브 시스템을 단순화된 인터페이스로 감싸서 외부에서 서브시스템의 복잡성 숨기는 것이 목표
- 클라이언트는 복잡한 내부 시스템 구조를 알 필요 없이 단순한 인터페이스로 시스템 사용 가능
- 즉, 서브 시스템을 단순화하고 시스템의 사용을 더 직관적이고 간편하게 함
구성 요소
1. Façade (퍼사드)
서브 시스템의 여러 클래스를 하나의 단순화된 인터페이스로 제공하는 클래스.
클라이언트가 시스템을 쉽게 사용할 수 있도록 인터페이스 제공
2. Subsystem Classes (서브 시스템 클래스들)
복잡한 작업을 수행하는 개별 클래스들
퍼사드는 이 클래스들의 복잡한 내부 구현을 감추고, 간단한 인터페이스로 이를 호출
3. Client (클라이언트)
퍼사드를 사용하여 서브 시스템을 간접적으로 활용하는 객체.
클라이언트는 퍼사드를 통해 서브 시스템의 복잡한 내부 세부 사항을 몰라도 되며, 간단한 방법으로 작업 수행
패턴 흐름
1. 클라이언트는 퍼사드를 통해 서브 시스템에 접근하고, 복잡한 로직을 처리할 때 단순한 인터페이스 사용
2. 퍼사드는 여러 서브 시스템 클래스들을 호출하여 클라이언트 요청 처리
3. 퍼사드는 서브 시스템 내부의 복잡한 구현을 숨기고, 클라이언트에게 간단하고 직관적인 방법 제공
퍼사드 패턴 예제 (C++)
1. #include <iostream>
2. #include <string>
3. #include <map>
4. #include <list>
5. #include <vector>
6. #include <iterator>
7.
8. using namespace std;
9.
10. struct AccountData{
11. int nAccountLevel;
12. int nGameMoney;
13. vector<string> m_vecChampion;
14. };
15.
16. class SearchCond{
17. public:
18. SearchCond(pair<string, string> pairAccountInfo){
19. m_pairAccountInfo = pairAccountInfo;
20. }
21.
22. bool CheckPassWord(){
23. return (m_pairAccountInfo.second == "비밀번호") ? true : false;
24. }
25.
26. private:
27. pair<string, string> m_pairAccountInfo;
28. };
29.
30.
31. class DatabaseConnection{
32. public:
33. DatabaseConnection(string strDBAccount){
34. m_strDBAccount = strDBAccount;
35. }
36.
37. bool ConnectionDB(){
38. cout << "DB 계정 정보 승인 요청" << endl;
39. return true;
40. }
41.
42. private:
43. string m_strDBAccount;
44. };
45.
46. class Database{
47. public:
48. Database(){
49. cout << "DB와 연결합니다." << endl;
50.
51. // 정보
52. AccountData testAccountData;
53. testAccountData.nAccountLevel = 5;
54. testAccountData.nGameMoney = 20000;
55. testAccountData.m_vecChampion.push_back("Morgana");
56. testAccountData.m_vecChampion.push_back("Ahri");
57. m_listResult.push_back(testAccountData);
58. }
59.
60. bool Execute(string strSQL, AccountData& resOut){
61. DatabaseConnection databaseCon("DB Account");
62.
63. if(databaseCon.ConnectionDB()){
64. cout << "DB 에서 값을 가져오는 중입니다. " << endl;
65. resOut = m_listResult.back();
66. return true;
67. }
68. else{
69. cout << "DB 계정이 잘못되었습니다. " << endl;
70. return false;
71. }
72. }
73.
74.
75. private:
76. list<AccountData> m_listResult;
77. };
78.
79.
80. class SQLGenerator{
81. public:
82. string GenerateSQL(SearchCond cond){
83. string sql;
84.
85. cout << "SQL 문장 생성" << endl;
86. return sql;
87. }
88. };
89.
90.
91. class DBHandler{
92. public:
93. DBHandler(){
94. m_Database = new Database();
95. }
96. ~DBHandler(){
97. delete m_Database;
98. }
99.
100.
101. bool Search(pair<string, string> nvList, AccountData& resOut){
102. SearchCond cond(nvList);
103.
104. if(!cond.CheckPassWord()){
105. cout << "잘못된 비밀번호" << endl;
106. return false;
107. }
108.
109. SQLGenerator generator;
110. string sql = generator.GenerateSQL(cond);
111.
112. return m_Database->Execute(sql, resOut);
113.
114. }
115.
116. private:
117. Database* m_Database;
118. };
119.
120.
121.
122.
123. int main() {
124. // DB
125. pair<string, string> AccountInfo;
126. AccountInfo.first = "ㅁㅁㅁ";
127. AccountInfo.second = "비밀번호";
128.
129. AccountData dbResult;
130.
131. DBHandler handler;
132. handler.Search(AccountInfo, dbResult);
133.
134. cout << "현재 레벨 : " << dbResult.nAccountLevel << endl;
135. cout << "현재 골드 : " << dbResult.nGameMoney << endl;
136.
137.
138. for(const auto& iter : dbResult.m_vecChampion){
139. cout << "소유 챔피언 " << iter << endl;
140. }
141.
142. return 0;
143. }
144.
퍼사드 패턴 장점
1. 서브 시스템의 복잡성 감추기
2. 복잡한 시스템을 하나의 인터페이스로 통합하여, 클라이언트가 접근할 지점이 하나로 줄어듦
3. 서브시스템의 변경이나 확장이 필요할 때, 퍼사드만 수정
퍼사드 패턴 단점
1. 시스템을 단순화하는 대신, 서브시스템에 대한 유연성이 떨어질 수 있음
2. 퍼사드는 추가적인 중간 레벨을 추가하므로, 간단한 시스템에서는 오히려 불필요한 추상화가 됨
3. 시스템이 매우 복잡하면, 퍼사드가 너무 커지거나 복잡해질 수 있음
'Unity > 디자인 패턴' 카테고리의 다른 글
| 디자인 패턴 (구조 패턴) - 프록시 패턴 (Proxy Pattern) (0) | 2025.08.30 |
|---|---|
| 디자인 패턴 (구조 패턴) - 플라이웨이트 패턴 (Flyweight Pattern) (0) | 2025.08.30 |
| 디자인 패턴 (구조 패턴) - 데코레이터 패턴 (Decorator Pattern) (0) | 2025.08.30 |
| 디자인 패턴 (구조 패턴) - 컴포지트 패턴 (Composite Pattern) (0) | 2025.08.30 |
| 디자인 패턴 (구조 패턴) - 어댑터 패턴 (Adapter Pattern) (0) | 2025.08.30 |