B/O - Strategy
- Category: behavioral
 - Type: object
 - Motivation: allow you to switch the algorithm based upon the situation
 

do {
    let sedan = Sedan(Simple())
    sedan.applyBrake()
    let sedan2 = Sedan(ABS())
    sedan2.applyBrake()
}
protocol Brake
{
    func brake()
}
class Simple: Brake
{
    func brake()
    {
        print("simple brake applied")
    }
}
class ABS: Brake
{
    func brake()
    {
        print("brake with ABS applied")
    }
}
protocol Car
{
    var brake: Brake { get }
    func applyBrake()
}
extension Car
{
    func applyBrake()
    {
        brake.brake()
    }
}
class Sedan: Car
{
    private(set) var brake: Brake
    init(_ brake: Brake)
    {
        self.brake = brake
    }
}