데코레이터 (Decorator) 디자인패턴

데코레이터(Decorator) 패턴은 객체의 기능을 동적으로 추가하거나 변경할 수 있는 패턴입니다. 이 패턴은 객체 지향 프로그래밍에서 많이 사용되는 패턴 중 하나입니다.

데코레이터 패턴을 예제와 함께 설명해보겠습니다. 예를 들어, iPhone 앱에서 사용자의 등급에 따라 쿠폰 할인 기능을 추가하는 기능을 구현한다고 가정해봅시다. 이때 쿠폰 할인 기능은 등급에 따라 다르게 적용되며, 데코레이터 패턴을 사용하여 동적으로 추가할 수 있습니다.

다음은 데코레이터 패턴을 사용하여 쿠폰 할인 기능을 추가하는 예제 코드입니다.

// 상위 레벨의 상품 클래스
class Product {

    // 가격 프로퍼티
    var price: Double

    // 초기화 메서드
    init(price: Double) {
        self.price = price
    }

    // 가격 계산 메서드
    func totalPrice() -> Double {
        return price
    }
}

// 쿠폰 할인 데코레이터 클래스
class CouponDecorator: Product {

    // 상위 레벨의 상품 객체
    var product: Product

    // 쿠폰 할인율
    var discount: Double

    // 초기화 메서드
    init(product: Product, discount: Double) {
        self.product = product
        self.discount = discount
        super.init(price: 0)
    }

    // 가격 계산 메서드
    override func totalPrice() -> Double {
        let totalPrice = product.totalPrice() * (1 - discount)
        return totalPrice
    }
}

// 사용 예제
let product = Product(price: 10000)
let goldCoupon = CouponDecorator(product: product, discount: 0.3)
let silverCoupon = CouponDecorator(product: product, discount: 0.2)
print(product.totalPrice())       // 10000
print(goldCoupon.totalPrice())    // 7000
print(silverCoupon.totalPrice())  // 8000

위의 예제에서는 Product 클래스를 정의하고, 쿠폰 할인 기능을 추가하는 CouponDecorator 클래스를 정의합니다. CouponDecorator 클래스는 Product 클래스를 상속받으며, Product 객체를 멤버 변수로 가지고 있습니다. 쿠폰 할인 기능은 객체 생성 시 할인율을 매개변수로 받아서 계산합니다. 이렇게 하면, Product 객체를 동적으로 변경하거나 확장할 수 있습니다.

데코레이터 패턴을 사용하면, 객체의 기능을 동적으로 추가하거나 변경할 수 있기 때문에, 유연성이 높아집니다. 이를 통해 객체 간의 결합도를 낮출 수 있고, 코드의 재사용성과 확장성을 향상시킬 수 있습니다. 또한, 데코레이터 패턴은 객체에 직접적인 변경을 가하지 않기 때문에, 원본 객체의 기능을 변경하지 않으면서 기능을 확장할 수 있습니다.

iOS에서는 많은 곳에서 데코레이터 패턴이 사용됩니다. 대표적인 예로 UIKit 프레임워크에서 UIView 클래스를 확장하는 UIView의 하위 클래스인 UIImageView, UILabel, UIButton 등이 있습니다. 이들 클래스들은 UIView 클래스를 상속받으면서 동시에 다양한 추가 기능을 제공하기 위해 데코레이터 패턴을 사용합니다.

UIImageView 클래스는 이미지를 표시할 수 있는 기능을 제공하며, UILabel 클래스는 텍스트를 표시할 수 있는 기능을 제공합니다. UIButton 클래스는 터치 이벤트를 처리할 수 있는 기능을 제공하며, UISwitch 클래스는 on/off 상태를 표시할 수 있는 기능을 제공합니다. 이들 클래스들은 UIView 클래스를 상속받으며, 데코레이터 패턴을 사용하여 다양한 추가 기능을 제공합니다.

또한, Core Graphics 프레임워크에서도 데코레이터 패턴이 사용됩니다. 예를 들어, CGContext 클래스는 그래픽 컨텍스트를 나타내는 클래스이며, 다양한 추가 기능을 제공하기 위해 CGContext의 하위 클래스인 UIGraphicsGetCurrentContext, UIGraphicsPushContext, UIGraphicsPopContext 등을 사용합니다. 이들 클래스들은 CGContext 클래스를 상속받으면서 다양한 추가 기능을 제공하기 위해 데코레이터 패턴을 사용합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다