수색…


소개

디자인 패턴은 소프트웨어 개발에서 자주 발생하는 문제에 대한 일반적인 솔루션입니다. 다음은 코드 설계 및 설계의 표준화 된 모범 사례 템플릿뿐 아니라 이러한 디자인 패턴이 적절한 공통적 인 상황의 예입니다.

구조 디자인 패턴 은 인터페이스를 만들고 더 많은 기능을 구현하기 위해 클래스와 객체의 구성에 중점을 둡니다.

어댑터

어댑터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를 동기화하는 복잡성은 클라이언트에서 숨겨져 있으며이 인터페이스는 프로그램의 어느 곳에서나 액세스 할 수 있습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow