美文网首页
Swift设计模式----模板方法模式

Swift设计模式----模板方法模式

作者: 青山不改 | 来源:发表于2020-04-25 13:12 被阅读0次

    模板方法模式:在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。
    现在有个订单要处理,我们定义超类:

    class OrderProcess: NSObject {
    
        func createOrder(productId: Int) -> String {
            print("正在生成商品:\(productId)的订单")
            return "order....."
        }
        
        func pay(orderId: String) -> Bool {
            return false
        }
        
        func resultBack(){
            
        }
    }
    

    超类里定义了处理订单的步骤,生成订单,支付订单,结果回调,我们生成订单的方式是一样的,但是支付方式和结果回调却可能不同,比如微信支付、支付宝支付。
    现在我们搞个微信支付的订单处理:

    class WeixinOrderProcess: OrderProcess {
        override func pay(orderId: String) -> Bool {
            print("正在调起微信支付\(orderId)")
            return true
        }
        
        override func resultBack() {
            print("微信支付成功")
        }
    }
    

    然后再搞个支付宝支付的方法:

    class AliOrderProcess: OrderProcess {
        override func pay(orderId: String) -> Bool {
            print("正在调起支付宝支付\(orderId)")
            return true
        }
        
        override func resultBack() {
            print("支付宝支付成功")
        }
    }
    
    

    这样客户端可以选择不同的支付方式来处理订单,复用了订单生产的逻辑:

            let ali = AliOrderProcess()
            let aliorderId = ali.createOrder(productId: 100)
            ali.pay(orderId: aliorderId)
            ali.resultBack()
            
            let weixin = WeixinOrderProcess()
            let weixinorderId = weixin.createOrder(productId: 100)
            weixin.pay(orderId: weixinorderId)
            weixin.resultBack()
    
    正在生成商品:100的订单
    正在调起支付宝支付order.....
    支付宝支付成功
    正在生成商品:100的订单
    正在调起微信支付order.....
    微信支付成功
    

    当然,这里只是演示模板方法模式,在实际应用中,订单生产在前,支付方式选择在后,肯定会在订单处理类里有个支付方式的属性,使用组合模式来处理。
    模板方法模式注重通用方法和详细步骤的现实,公用部分逻辑,然后子类去实现不同详细步骤,这样如果想要替换掉一些步骤,就可以再创建一个子类去实现,不用修改原来的类。

    比如高德地图里,路径规划时,首先接收两个地点,分别计算出经纬度,然后才会根据不同的出行方式,选择不同的路径实现步骤,就可以用模板方法模式来实现。

    相关文章

      网友评论

          本文标题:Swift设计模式----模板方法模式

          本文链接:https://www.haomeiwen.com/subject/ztahwhtx.html