Swift Language
Designmönster - strukturella
Sök…
Introduktion
Designmönster är allmänna lösningar på problem som ofta uppstår i mjukvaruutvecklingen. Följande är mallar för standardiserade bästa metoder för strukturering och design av kod, samt exempel på vanliga sammanhang där dessa designmönster skulle vara lämpliga.
Strukturella designmönster fokuserar på sammansättningen av klasser och objekt för att skapa gränssnitt och uppnå större funktionalitet.
Adapter
Adaptrar används för att konvertera gränssnittet för en viss klass, känd som en Adaptee , till ett annat gränssnitt, kallad målet . Operationer på målet anropas av en klient , och dessa operationer anpassas av adaptern och vidarebefordras till Adaptee.
I Swift kan adaptrar ofta bildas genom användning av protokoll. I följande exempel har en klient som kan kommunicera med målet förmågan att utföra funktioner i klassen Adaptee genom användning av en adapter.
// 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()
}
}
Exempel på flöde av en envägsadapter: Client -> Target -> Adapter -> Adaptee
Adaptrar kan också vara i två riktningar, och dessa är kända som tvåvägsadaptrar . En tvåvägsadapter kan vara användbar när två olika klienter behöver se ett objekt annorlunda.
Fasad
En fasad ger ett enhetligt gränssnitt på hög nivå till delsystemgränssnitt. Detta möjliggör enklare, säkrare åtkomst till de mer allmänna faciliteterna i ett delsystem.
Följande är ett exempel på en fasad som används för att ställa in och hämta objekt i 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!
}
}
Användning kan se ut som följande.
Defaults.set("Beyond all recognition.", forKey:"fooBar")
Defaults.object(forKey: "fooBar")
Komplexiteten i att komma åt den delade instansen och synkronisera UserDefaults är dold för klienten, och det här gränssnittet kan nås var som helst i programmet.