Facade Pattern(외관 패턴)은 소프트웨어 공학 디자인 패턴 중 하나이다. 객체 지향 프로그래밍 분야에서 자주 쓰인다. Facade는 "건물의 정면"을 의미한다. 퍼사드는 클래스 라이브러리 같은 어떤 소프트웨어의 다른 커다란 코드 부분에 대한 간략화된 인터페이스를 제공하는 객체이다.
- 클라이언트가 사용할 간단한 인터페이스를 제공한다. 이 클래스는 시스템의 복잡한 부분을 캡슐화하고, 클라이언트의 요청을 적절한 시스템 컴포넌트에 전달한다.
- 시스템의 복잡한 부분을 구현하는 클래스들이다. 이들은 퍼사드에 의해 직접 호출되지만, 퍼시드 없이도 독립적으로 기능할 수 있다.
import UIKit
protocol Facade {
func work()
}
struct CPU {
func work(with menory: Memory) { }
}
struct Memory {
func input(from devices: [Device]) { }
func output(to devices: [Device]) { }
}
class Device { }
class InputDevice: Device { }
class OutputDevice: Device { }
class Keyboard: InputDevice { }
class Monitor: OutputDevice { }
class TouchBar: Device { }
struct Computer: Facade {
private let cpu = CPU()
private let memory = Memory()
private let keyboard = Keyboard()
private let monitor = Monitor()
private let touchBar = TouchBar()
func work() {
memory.input(from: [keyboard, touchBar])
cpu.work(with: memory)
memory.output(to: [monitor])
}
}
let computer = Computer()
computer.work()
import UIKit
// Subsystem
class NetworkManager {
func requestData(from url: URL, completion: @escaping (Data?, Error?) -> Void) {
// Network request logic
}
}
// Subsystem
class CacheManager {
func cache(data: Data, for url: URL) {
// Cache data logic
}
func getCachedData(for url: URL) -> Data? {
// Get cached data logic
}
}
// Facade
class ImageLoader {
private let networkManager = NetworkManager()
private let cacheManager = CacheManager()
func loadImage(from url: URL, completion: @escaping (UIImage?) -> Void) {
if let cachedData = cacheManager.getCachedData(for: url), let image = UIImage(data: cachedData) {
completion(image)
} else {
networkManager.requestData(from: url) { data, error in
guard let data = data, error == nil else {
completion(nil)
return
}
self.cacheManager.cache(data: data, for: url)
let image = UIImage(data: data)
completion(image)
}
}
}
}
// Client
let url = URL(string: "https://example.com/image.png")!
let imageLoader = ImageLoader()
imageLoader.loadImage(from: url) { image in
// Use the image
}
제가 학습한 내용을 요약하여 정리한 것입니다. 내용에 오류가 있을 수 있으며, 어떠한 피드백도 감사히 받겠습니다.
감사합니다.