首先 回顾一下学习的新知识和已有的知识!
1 面向对象编程不是类越多越好,类的划分是为了封装。
2 分类的基础是抽象,具有相同属性和功能的对象的抽象才是类!如打一折和打九折抽象出来应属于同一个类!
3 策略是在给定输入条件下,实现某个目标的计划或方案!策略模式我想就是依据不同输入得出不同方案结果的一种做事方式!策略应该包括策略操作和策略实现,在策略操作中定义了输入与输出;策略实现的工作则留给了各个算法类去实现了,这些类以不同的方案实现统一操作(如收费操作,可以是打折后收费,也可以是积分后收费。
再来 比较一下本节中用于实现商场收银软件不同模式。
无论是简单工厂模式、策略模式,还是策略与简单工厂结合模式,都将相同操作(收费)的不同算法或策略(打八折收费,积分收费,满 100 返 10 收费等)单独作为一个类,并且他们共同继承于一个抽象类。唯一不同的就是如何选择这些方法策略!
1 简单工厂模式在 factory 中使用 switch case 语句来完成收费,这使 factory 类中包括了所有的行为方式(或算法),如果要维护或更改这些行为方式,那么代码就需要重新编译部署,这是很糟糕的处理方式!由于行为方法的变动性较大,如果发生变化我们就得改变这个工厂!
2 策略模式则克服了改动大的缺点(封装了变化),它在 context 中定义了一个输入策略的方法,定义了一个获得该策略下收费结果的方法。虽然封装了可变性,但在客户端中仍旧需要使用 switch case 来决定使用哪种算法!
3 策略与简单工厂结合的方式,在 context 类中仍旧定义输入方法和输出方法,但结合了 factory 类中使用 switch case 语句决定算法的方法!这样克服了略模式中在客户端使用 switch case 来决定算法的缺点,(即由客户端承担决定算法的责任,转由 context 类承担了决定算法的责任)但仍就没能摆脱使用 switch case 的缺点!
疑问
策略与简单工厂结合模式克服了简单工厂模式中包含了所有行为方式的缺点没有?如果没有那这个方法的优越性在哪(他们的客户端都不需要承担决定使用何种算法的责任)?比较这两者的 factory 类和 context 类,无非是 factory 类使用 return 来返回类(也就返回了结果), context 类使用方法来获得该算法下的结果,这样是不是完成了算法对用户的封闭性呢?