架构算法设计模式和编程理论手机移动程序开发程序员

iOS开发系列-Strategy模式

2016-12-19  本文已影响0人  DEREK_ZHOU

前言

在软件工程中,设计模式(Design Pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。

策略模式(Strategy Pattern)中定义一系列算法,并将每一个算法封装起来,使使它们可以相互替换,策略模式让算法独立于它的客户而变化。

下面我会就iOS实际开发中的case, 举例说明Strategy模式的在开发中的具体应用。

Case Study:

在开发中, 我们会遇到各种表单的提交需求, 在实际需求中,表单提交之前一般都需要检查一下所填写的数据的有效性。这些对于特定类型的数据的有效性检查,可能在程序中被反复用到。下面我就以开发中必不可少的用户登录功能,来看看Strategy模式的具体应用。

以email方式登录为例。你至少需要检查email和password输入的有效性。在修改email或者修改password时, 你又需要使用email和password数据有效性的检查逻辑。对于这种多于一次使用逻辑,基于DRY(Don't Repeat Youself)原则,我们需要封装起来。

用户登录页面
protocol Validator {
    func isValid(text: String?) -> Bool
}
class EmailValidator: Validator {
    func isValid(text: String?) -> Bool {
        let regEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,64}"
        if let text = text {
            let entryTest = NSPredicate(format: "SELF MATCHES %@", regEx)
            return entryTest.evaluate(with: text)
        }
        return false
    }
}
class PasswordValidator: Validator {
    func isValid(text: String?) -> Bool {
        let regEx = "[A-Z0-9a-z._%+-;/><#]{6,30}"
        if let text = text {
            let entryTest = NSPredicate(format: "SELF MATCHES %@", regEx)
            return entryTest.evaluate(with: text)
        }
        return false
    }
}
enum ValidationType: Int {
    case Email = 0
    case Password
}
class ValidationManager {
    
    private lazy var validators: [Validator] = [EmailValidator(), PasswordValidator()]
    
    func validationForText(text: String?, withValidationType validationType: ValidationType) -> Bool {
        return validators[validationType.rawValue].isValid(text: text)
    }
}
    private lazy var validationManager = ValidationManager()
    @IBAction func tapLoginButton(_ sender: UIButton) {
        let emailValidation = validationManager.validationForText(text: emailField.text, withValidationType: .Email)
        let passValidation = validationManager.validationForText(text: passwordField.text, withValidationType: .Password)
        
        if emailValidation && passValidation {
            // Log in successfully and enter main view
            performSegue(withIdentifier: "ShowMainView", sender: self)
        } else {
            // validation failed. You can do anything you want to alert user.
            let alert = UIAlertController(title: "Failed", message: "Email or password is not valid.", preferredStyle: .alert)
            let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
            alert.addAction(cancelAction)
            present(alert, animated: true, completion: nil)
        }
    }

总结

具体代码:StrategyPatternDemo

上一篇 下一篇

猜你喜欢

热点阅读