Swift Language
디자인 패턴 - 구조
수색…
소개
디자인 패턴은 소프트웨어 개발에서 자주 발생하는 문제에 대한 일반적인 솔루션입니다. 다음은 코드 설계 및 설계의 표준화 된 모범 사례 템플릿뿐 아니라 이러한 디자인 패턴이 적절한 공통적 인 상황의 예입니다.
구조 디자인 패턴 은 인터페이스를 만들고 더 많은 기능을 구현하기 위해 클래스와 객체의 구성에 중점을 둡니다.
어댑터
어댑터 는 Adaptee 라고하는 주어진 클래스의 인터페이스를 Target 이라고하는 다른 인터페이스로 변환하는 데 사용됩니다. 대상에 대한 작업은 클라이언트에 의해 호출되며 이러한 작업은 어댑터에 의해 적응 되어 Adaptee로 전달됩니다.
스위프트에서는 프로토콜을 사용하여 어댑터를 구성 할 수 있습니다. 다음 예제에서 대상과 통신 할 수있는 클라이언트에는 어댑터를 사용하여 Adaptee 클래스의 기능을 수행 할 수있는 기능이 제공됩니다.
// The functionality to which a Client has no direct access
class Adaptee {
func foo() {
// ...
}
}
// Target's functionality, to which a Client does have direct access
protocol TargetFunctionality {
func fooBar() {}
}
// Adapter used to pass the request on the Target to a request on the Adaptee
extension Adaptee: TargetFunctionality {
func fooBar() {
foo()
}
}
단방향 어댑터의 예제 흐름 : Client -> Target -> Adapter -> Adaptee
어댑터는 양방향이 될 수 있으며, 이러한 양방향 어댑터로 알려져 있습니다. 양방향 어댑터는 두 개의 서로 다른 클라이언트가 오브젝트를 다르게 볼 때 유용 할 수 있습니다.
정면
Facade 는 서브 시스템 인터페이스에 통합 된 고급 인터페이스를 제공합니다. 따라서 하위 시스템의보다 일반적인 기능에 더 간단하고 안전하게 액세스 할 수 있습니다.
다음은 UserDefaults에서 개체를 설정하고 검색하는 데 사용되는 Facade의 예입니다.
enum Defaults {
static func set(_ object: Any, forKey defaultName: String) {
let defaults: UserDefaults = UserDefaults.standard
defaults.set(object, forKey:defaultName)
defaults.synchronize()
}
static func object(forKey key: String) -> AnyObject! {
let defaults: UserDefaults = UserDefaults.standard
return defaults.object(forKey: key) as AnyObject!
}
}
사용법은 다음과 같습니다.
Defaults.set("Beyond all recognition.", forKey:"fooBar")
Defaults.object(forKey: "fooBar")
공유 인스턴스에 액세스하고 UserDefaults를 동기화하는 복잡성은 클라이언트에서 숨겨져 있으며이 인터페이스는 프로그램의 어느 곳에서나 액세스 할 수 있습니다.