装饰模式

装饰模式 定义:

动态地给一个对象添加一些额外的职责。

装饰模式-场景

需要透明且动态地扩展类的功能时。

装饰模式角色划分

4个核心角色:
角色一:抽象组件
角色二:具体组件
角色三:抽象装饰者
角色四:具体装饰者(特定:1、持有抽象组件对象。2、继承抽象组件)

示例程序

角色一:抽象组件->MobilePhone(手机)
角色二:具体组件->iPhoneX
角色三:抽象装饰者->MobilePhoneShell
角色四:具体装饰者
质量好的手机壳:耐磨、防水、防尘…
质量差的手机壳:耐磨

代码:

/// 装饰模式 角色一: 抽象组件
protocol ModuleProtocol {
     func takePhone()
}
/// 装饰模式  角色二: 具体组件 iphoneX 
class ModuleIPHoneX: ModuleProtocol {
    
     func takePhone() {
        print("打电话 ----- ")
    }
}
/// 装饰模式 角色三: 抽象装饰者  手机壳  
/*
 特性:持有抽象组件的对象
 继承 或者持有抽象组件的引用
 */
class MobilePhoneShell: ModuleProtocol {
    
    private var mobile:ModuleProtocol
    
    init(mobile:ModuleProtocol) {
        self.mobile = mobile
    }
    
    func takePhone() {
        self.mobile.takePhone()
    }
    
}
/// 装饰模式 角色四: 具体装饰者
class GoodMobilePhoneShell: MobilePhoneShell {
    
    override init(mobile: ModuleProtocol) {
        super.init(mobile: mobile)
    }
    
    func waterProof()  {
        print("好手机壳 -- 防水功能")
    }
    
    func dustProof()  {
        print("好手机壳 -- 防尘功能")
    }
    
    func wearProof()  {
        print("好手机壳 -- 耐磨功能")
    }
}
/// 装饰者模式 角色四: 具体装饰者: 差手机壳
class PoorMobilePhoneShell: MobilePhoneShell {
    override init(mobile: ModuleProtocol) {
        super.init(mobile: mobile)
    }
    
    func waterProof()  {
        print("差的手机壳-- 防水功能")
    }
}
//外部调用
let iphone = ModuleIPHoneX()
let goodSheel = GoodMobilePhoneShell(mobile: iphone)
goodSheel.dustProof()
goodSheel.takePhone()
        
 let poorSheel = PoorMobilePhoneShell(mobile: iphone)
 poorSheel.takePhone()
 poorSheel.waterProof()

你可能感兴趣的:(装饰模式)