Swift Language
デザインパターン - 構造
サーチ…
前書き
デザインパターンは、ソフトウェア開発で頻繁に発生する問題に対する一般的な解決策です。以下は、コードの構造化と設計における標準化されたベストプラクティスのテンプレートと、これらのデザインパターンが適切である一般的なコンテキストの例です。
構造設計パターンは、インタフェースを作成し、より大きな機能を達成するためのクラスとオブジェクトの構成に焦点を当てています。
アダプタ
アダプタは別のインターフェースに、Adapteeとして知られている指定されたクラスのインタフェースを変換するために使用され、 ターゲットと呼ばれます。ターゲットによる操作はクライアントによって呼び出され、これらの操作はアダプターによって適合され、アダプターに渡されます。
Swiftでは、多くの場合、プロトコルを使用してアダプターを形成することができます。次の例では、ターゲットと通信できるクライアントにアダプタを使用して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
アダプタはまた、双方向することができ、これらは双方向アダプタとして知られています。 2つの異なるクライアントがオブジェクトを異なる方法で表示する必要がある場合は、双方向アダプタが便利です。
ファサード
ファサードは、サブシステムインタフェースへの統一された高レベルインタフェースを提供します。これにより、サブシステムのより一般的な機能へのより簡単で安全なアクセスが可能になります。
以下は、UserDefaultsでオブジェクトを設定および取得するために使用されるファサードの例です。
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の同期の複雑さはクライアントから隠されており、このインターフェイスはプログラムのどこからでもアクセスできます。