/*
现在公司有3个理货员、分别处理阿司匹林、扑热息痛和抗组胺药。
当需要出货时、3人会通知大家、一起出货。
在不新增新线程、3人都不需要有对方资料、不需要持有特别广播的通讯控件的情况下、也能通知大家。

公司:大宏药业生产部

职员:
卡卡、阿司匹林
路飞、扑热息痛
白云:抗组胺药

动作:
出货(药名 : 药品)
*/

// 抽象觀察者
class Observer {
    var p_stName : String = ""
    func getName() -> String { return p_stName }
    func setName(p_stInputName : String) { }
    func completeMission() { }
    func shipProduct(p_obBossOffice : BossOffice) { }
    func help() { }
}

// 具體觀察者
class Employee : Observer {
    var p_stEmployeeName : String = ""
    
    init(p_stInputName : String) {
        p_stEmployeeName = p_stInputName
    }
    
    override func getName() -> String {
        return p_stEmployeeName
    }
    
    override func setName (p_stInputName : String) {
        p_stEmployeeName = p_stInputName
    }
    
    override func completeMission() {
        print("\(p_stEmployeeName) completes works.")
    }
    
    override func shipProduct(p_obBossOffice : BossOffice) {
       print("\(p_stEmployeeName) ships products.")
       p_obBossOffice.notifyObserver(p_stInputEmployeeName: p_stEmployeeName)
    }
    
    override func help() {
        print("\(p_stEmployeeName) comes to help.")
    }
}

// 目标类
class Company {
    var p_stCompanyName : String = ""
    var p_arrEmployees: [Observer] = []
    
    func setCompanyName (p_stInputComName : String) {
        p_stCompanyName = p_stInputComName
    }
    
    func getCompanyName() -> String {
        return p_stCompanyName
    }
    
    func registerEmployee(p_obObserver : Observer) { }
    
    func notifyObserver(p_stInputEmployeeName : String) { }
}

// 具体目标类
class BossOffice : Company {
    func rollCall(p_stInputTeamName : String) {
        p_stCompanyName = p_stInputTeamName
        print("\(p_stCompanyName) is built up")
    }
    
    override func registerEmployee(p_obObserver : Observer) {
        print("Employee \(p_obObserver.getName()) joins \(p_stCompanyName)")
        p_arrEmployees.append(p_obObserver)
    }
    
    override func notifyObserver (p_stInputEmployeeName : String) {
        print("\(p_stCompanyName) notice: \(p_stInputEmployeeName) ships products. Please go to help.");
        
        for p_obEmp in p_arrEmployees {
            p_obEmp.help()
        }
    }
}

let company = Company()
let boss = BossOffice()
boss.rollCall(p_stInputTeamName : "Team B")

let KaKa = Employee(p_stInputName : "KaKa")
boss.registerEmployee(p_obObserver : KaKa)

let LuFei = Employee(p_stInputName : "LuFei")
boss.registerEmployee(p_obObserver : LuFei)

let BaiYun = Employee(p_stInputName : "BaiYun")
boss.registerEmployee(p_obObserver : BaiYun)

LuFei.shipProduct(p_obBossOffice : boss)

/*
Team B is built up

Employee KaKa joins Team B
Employee LuFei joins Team B
Employee BaiYun joins Team B

LuFei ships products.

Team B notice: LuFei ships products. Please go to help.
KaKa comes to help.
LuFei comes to help.
BaiYun comes to help.
*/

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 kk匡 的頭像
    kk匡

    kk匡的日記&學習筆記

    kk匡 發表在 痞客邦 留言(0) 人氣()