Structural Design Pattern - Facade, Adapter, Bridge

kyle Kim·2022년 12월 15일
0

iOS개발

목록 보기
18/22

Structural Design Pattern은 Object들간, Class들 간의 관계와 어떻게 구성되는지를 다루어 단순화시키는 디자인 패턴이다.

iOS 개발에서 좀 많이 사용되는 Structural Design Pattern을 다루겠다.

1. Facade 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())

Facade 장점

  • 코드를 분리할 수 있고 시스템과 객체 간의 종속성을 줄이고 계층화할 수 있다.
  • 서브 컴포넌트들의 낮은 결합도 때문에, 수정과 확장에 용이하다.

Facade 단점

  • 기존의 코드가 존재하고 있다면 facade 패턴을 추가하기 복잡할 수 있다.

2. Adapter Pattern

서로 다른 인터페이스를 가진 여러 객체를 함께 사용할 수 있게 해주는 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())

Adapter 장점

  • 연관성 없는 두 객체를 묶어서 사용해야할때 좋다.
  • 외부 모듈, 라이브러리를 사용, 또는 가공해서 사용이 가능하기 때문에 코드의 재사용성에 강점이 있다.

Adapter 단점

  • 클래스를 추가해야하기 때문에 복잡도가 증가할 수도 있다.

3. Bridge Pattern

구현부분에서 추상부분을 분리하여 두 부분이 독립적으로 확장 및 개발이 가능하도록 해주는 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()

Adapter 장점

  • 구현과 추상 부분이 나뉘어져있기 때문에 수정이나 개발을 독립적으로 할 수 있다.
  • 코드의 확장성에 유리하다.

Adapter 단점

  • 추후에 확장이 필요 없을시에는 과할 수도 있다.
profile
가고일(gagoil)의 개발일지

0개의 댓글