设计模式二之:策略模式
基于面向对象编程的语言有很多,Java ,c++ ,c# ,Objective-C等等,但设计模式都是相通的,本文的demo仅以OC来阐述策略模式的设计思路,希望能对大家有所启发。
面向对象编程的特点是,封装,继承,多态,这是老生常谈的话题,但是很多开发者在实际应用中,不自然的就会以面向过程的思路去想计算机应该怎么执行某个事件,下面我就举个例子来更加具体形象的去阐述本文的设计模式如何具体的去应用,帮助大家更好的理解面向对象编程。
我举一个简单的例子来讲讲策略模式
有一个命题是:给商场设计一套结算系统。
思路: 1、首先,单价、物品数量、总价、物品清单列表。这些是肯定有的。第一点不多说。
2、需要一个折扣系统。包含9折、8折……等等的各种折扣,还需要包含满多少减多少,满多少送多少这些类型。因此,把一样的东西都抽出来。这就用到了上一篇讲的简单工厂模式。
注意点: 面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。打一折和打九折只是形式不同,抽象分析出来,所有的打折算法都是一样的,所以打折算法应该是一个类。
因此,按上述的思路,写出来的东西应该大致是这样一个框架:
- 现金收费抽象类: 现金收取超类的抽象方法,收取现金,参数为原价,返回当前价
- 正常收费子类: 正常收费,原价返回
- 打折收费子类: 打折收费,初始化时,必须输入折扣率,如5折就是0.5
- 返利收费子类: 返利收费,初始化时必须要输入返利条件和返利值,若大于返利条件,则需要减去返利值
- 现金收费工厂类: 一个方法,传入收费类型type,根据Type返回相应的对象
按如上思路,就是简单把上一篇的内容简单工厂模式拿过来套用了,虽然也能解决这个问题,但是这个模式只是解决对象的创建问题,由于工厂本身包括了所有的收费方式,商场是可能经常性的更改打折额度和返利额度,每次维护或扩展收费方式都要改动这个工厂,以至于代码需要重新编译部署,这不是一个优雅的程序员应有的处理问题的方式,面对算法的时长变动,肯定有更加优雅的解决方案。
下面正式进入策略模式:
定义: 策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式