命令(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()
//商品名称:阿迪王,子标题:牛逼
//商品名称:耐克,子标题:垃圾
//=======================
//商品名称:阿迪王,子标题:牛逼