设计模式之 Strategy 策略模式:Swift 实现

本文介绍了策略模式在解决排序问题中的应用。通过定义一个策略接口并实现不同的排序算法(如选择排序和插入排序),策略模式允许在运行时切换不同的排序策略。在示例代码中,`Problem`类持有`Strategy`接口引用,可以根据需要切换排序策略,展示了策略模式的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Strategy Mode 策略模式

做同一件事情,可以有不同的策略来实现,我们使用策略模式使得在切换不同策略的时候更加方便。

对于策略模式,我们这样描述:
Strategy mode set some solution class, and each solution can be substituted by other solution easily. When we face different problem, we choose different solution to solve problem. The Problem class hold a reference of Strategy interface to use different strategy.

策略模式设定了一些算法类,每个算法类可以被其它算法类所替换。当我们面对不同的问题时,我们选择不同的策略来解决问题。“问题” 类持有 “策略”接口, 以便使用不同的策略。

策略模式

protocol Strategy {
    func sort(_ nums: inout [Int]) -> [Int]
}

// Strategy A
class SelectedSort: Strategy {
    func sort(_ nums: inout [Int]) -> [Int] {
        print("Selected sort")
        var len = nums.count
        if len <= 1 {
            return nums
        }
        for i in 0..<len {
            var minIndex = i
            for j in (i + 1)..<len {
                if nums[j] < nums[minIndex] {
                    minIndex = j
                }
            }
            var tmp = nums[i]
            nums[i] = nums[minIndex]
            nums[minIndex] = tmp
        }
        return nums
    }
}

// Strategy B
class InsertSort: Strategy {
    func sort(_ nums: inout [Int]) -> [Int] {
        print("Insert sort")
        var len = nums.count
        if len <= 1 {
            return nums
        }
        for i in 1..<len {   
            var left = i - 1
            while true {
                if left < 0 || nums[i] > nums[left] {
                    var cover = i - 1
                    var t = nums[i]
                    while cover > left {
                        nums[cover + 1] = nums[cover] 
                        cover -= 1
                    } 
                    nums[left + 1] = t
                    break
                } else {
                    left -= 1
                }
            }
        }
        return nums
    }
}

class Problem {
    private var strategy: Strategy
    init(strategy: Strategy) {
        self.strategy = strategy
    }
    func solve(_ nums: inout [Int]) -> [Int] {
        strategy.sort(&nums)
    }
    
    func changeStrategy(strategy: Strategy) {
        self.strategy = strategy
    }
}

var nums = [2, 6, 1, 5, 0, 3]

var a = SelectedSort()
var b = InsertSort()
var problem = Problem(strategy: a)
problem.solve(&nums)
print(nums)

nums.shuffle()
print(nums)

problem.changeStrategy(strategy: b)
problem.solve(&nums)
print(nums)

以上代码中,problem 持有一个 strategy 引用,需要解决问题时就使用这个引用所指的策略对象来解决问题,对于同一个排序问题,可以使用不同策略来完成,这里有 a、b 两种策略可选。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值