Swift 重学设计模式系列之命令模式

命令(Command)模式的定义如下:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。

命令模式的主要优点如下。
    1.    降低系统的耦合度。命令模式能将调用操作的对象与实现该操作的对象解耦。
    2.    增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,它满足“开闭原则”,对扩展比较灵活。
    3.    可以实现宏命令。命令模式可以与组合模式结合,将多个命令装配成一个组合命令,即宏命令。
    4.    方便实现 Undo 和 Redo 操作。命令模式可以与后面介绍的备忘录模式结合,实现命令的撤销与恢复。

其缺点是:可能产生大量具体命令类。因为计对每一个具体操作都需要设计一个具体命令类,这将增加系统的复杂性。

class Goods {
    var name: String
    var subName: String
    
    init(name: String, subName: String) {
        self.name = name
        self.subName = subName
    }
    
    func printInfo() {
        
        print("商品名称:\(self.name),子标题:\(self.subName)")
        
    }
}

// 命令类
class Command {
    enum CommandType {
        case Add
        case Delete
    }
    var name: String
    var sbuName: String?
    var type:CommandType
    init(name: String, subName: String?, type: CommandType) {
        self.name = name;
        self.sbuName = subName;
        self.type = type;
    }
}



class ShoppingCart {
    
    var goodsArray = Array<Goods>()
    
    func executiveCommand(command:Command){
       
        if command.type == .Add {
            addGoods(name: command.name, subName: command.sbuName!)
        }
       
        if command.type == .Delete {
            deleteGoods(name: command.name)
        }
    }
    
    
    func addGoods(name:String, subName: String) {
        let goods = Goods(name: name, subName: subName);
        goodsArray.append(goods);
    }
    
    func deleteGoods(name:String) {
        var index:Int? = nil
        for i in 0 ..< goodsArray.count {
            if goodsArray[i].name == name {
                index = i;
            }
        }
        
        if let index = index {
            goodsArray.remove(at: index)
        }
    }
    
    func printGoodsInfo() {
        for goods in goodsArray {
            goods.printInfo()
        }
    }
    
}

let shopCart = ShoppingCart()
let command1 = Command(name: "阿迪王", subName: "牛逼", type: .Add)
let command2 = Command(name: "耐克", subName: "垃圾", type: .Add)
shopCart.executiveCommand(command: command1)
shopCart.executiveCommand(command: command2)
shopCart.printGoodsInfo()
let command3 = Command(name: "耐克", subName: nil, type: .Delete)
shopCart.executiveCommand(command: command3)
print("=======================")
shopCart.printGoodsInfo()

//商品名称:阿迪王,子标题:牛逼
//商品名称:耐克,子标题:垃圾
//=======================
//商品名称:阿迪王,子标题:牛逼

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、资源1项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值