2.策略模式

1.需求:

一个部队要出兵作战,部队有3个小队。A小队用a武器,B小队用b武器,C小队用c武器。

  • 实现方式1:

A、B、C都是角色,继承于一个基类
a、b、c都是武器,可以提供一个协议WeaponBehavior,武器使用方法useWeapon()
A、B、C分别在自己的类中实现各自的useWeapon()

以上实现存在问题:

1.useWeapon()的代码可能存在重复代码

  • 实现方式2:

A、B、C都是角色,继承于一个基类
a、b、c都是武器,可以提供一个协议WeaponBehavior,基于该协议实现不同的武器使用行为
A、B、C调用不同的武器行为

以上遵循的原则:

设计原则1:找出应用中可能需要变化之处,把它们独立出来,不要和那些不变的代码混在一起。
设计原则2:针对接口编程,而不是针对实现编程
设计原则3:多用组合,少用继承

二:策略模式

定义了算法族(就是上面鸭子的各种飞行行为),分别封装了起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户

//实现角色可以使用的不同的攻击行为,也就是不同的攻击策略
//武器策略
protocol WeaponBehavior {
    func useWeapon();
}

class AWPBehavior: WeaponBehavior {
    func useWeapon() {
        print("大狙---biu~biu~")
    }
}

class HK48Behavior: WeaponBehavior {
    func useWeapon() {
        print("HK48---tu~tu~tu~")
    }
}

class PistolBehavior: WeaponBehavior {
    func useWeapon() {
        print("手枪--pa~pa~pa~")
    }
}

//上面定义了一系列的武器策略
//下面是用户=================
class Character {
    //默认是配备的是手枪
    private var weapon: WeaponBehavior! = PistolBehavior()
    
    func setWeapon(weapon: WeaponBehavior) {
        self.weapon = weapon
    }
    
    //换手枪
    func changePistol() {
        self.setWeapon(PistolBehavior());
    }
    
    func fire() {
        guard self.weapon != nil else {
            return
        }
        self.weapon.useWeapon()
    }
}

//中尉只配备了手枪和HK48
class Lieutenant: Character {
    
    override init() {
        super.init();
    }
    
    //切换武器(策略):换HK
    func changeHK() {
        self.setWeapon(HK48Behavior());
    }
}

//上尉尉只配备了手枪和大狙
class Captain: Character {
    
    override init() {
        super.init();
    }
    //切换武器(策略):换大狙
    func changeAWP() {
        self.setWeapon(AWPBehavior());
    }
}



//中尉
let lieutenant: Lieutenant = Lieutenant()
lieutenant.fire()

print("\n手枪火力不行,得换HK48\n")

lieutenant.changeHK()
lieutenant.fire()

参考资料:
1)《Header First设计模式》
2)青玉伏案
http://www.cnblogs.com/ludashi/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 今天来讲一讲“策略模式”(Strategy Pattern)。为什么第二个讲它呢?单例模式第一个讲是我开始以为它最...
    akak18183阅读 2,629评论 0 0
  • 1,定义 策略模式,它定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法...
    Kenny丶Mo阅读 3,315评论 0 1
  • 范七 2Jae Chapter5:崔荣宰的声线 崔荣宰因为她这一句话,险些碰倒了杯子。 约莫一个多小时后...
    亦木辛阅读 2,924评论 0 2
  • 褪去刀光剑影,我见你如诗生命 ——读priest《有匪》有感 ...
    嗷大喵爱石榴阅读 5,726评论 0 6
  • 陆荣廷在成为大军阀之前本名陆阿宋,是个穷光蛋。他在广西、越南交界地方混日子的时候正好也是他最穷困的时候。在这里他追...
    Pengkof阅读 5,688评论 0 2

友情链接更多精彩内容