Structural Design Pattern은 Object들간, Class들 간의 관계와 어떻게 구성되는지를 다루어 단순화시키는 디자인 패턴이다.
iOS 개발에서 좀 많이 사용되는 Structural Design Pattern을 다루겠다.
간략화된 인터페이스를 제공하여 서브 시스템들의 복잡성을 줄여주고 서브 시스템 간의 의존성을 줄여주는 Design Pattern이다.
class SubSystemA {
func action() -> String {
return "A"
}
}
class SubSystemB {
func action() -> String {
return "B"
}
}
class Facade {
let subSystemA: SubSystemA
let subSystemB: SubSystemB
init(subSystemA: SubSystemA, subSystemB: SubSystemB) {
self.subSystemA = subSystemA
self.subSystemB = subSystemB
}
func actionAll() -> String {
return self.subSystemA.action() + self.subSystemB.action()
}
}
// 사용 예시
let facade = Facade(subSystemA: SubSystemA(), subSystemB: SubSystemB())
print(facade.actionAll())
서로 다른 인터페이스를 가진 여러 객체를 함께 사용할 수 있게 해주는 Design Pattern이다.
// 외부 라이브러리 또는 외부 모듈
class Adaptee {
public func action() -> String {
return "Adaptee"
}
}
// Adapter에 사용될 protocol 정의
// class를 사용할 수도 있음.
protocol AdapterProtocol {
func useAction() -> String
}
class Adapter: AdapterProtocol{
private var adaptee: Adaptee
init(adaptee: Adaptee) {
self.adpatee = adaptee
}
func useAction() -> String {
return adaptee.action()
}
}
// 사용 예시
let adapter = Adapter(adaptee: Adaptee())
print(adapter.useAction())
구현부분에서 추상부분을 분리하여 두 부분이 독립적으로 확장 및 개발이 가능하도록 해주는 Design Pattern이다.
protocol Animal {
func run()
}
class Cat: Animal {
func run() { }
}
class Dog: Animal {
func run() { }
}
// 만약에 BullDog이라는 클래스를 만들면 아래와 같다.
class BullDog: Dog {
func run() { }
}
////////////////////////////////////////////
// Bridge Pattern 적용
protocol TypedAnimal {
var animal: Animal { get set }
func run()
}
class BullDog: TypedDog {
var animal: Animal
init(animal: Animal) {
self.animal = animal
}
func run() { }
}
// 사용 예시
let dog = Dog()
let bullDog = BullDog(animal: dog)
bullDog.run()