策略模式学习和理解

策略模式:定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。也称为政策模式(Policy)


举个例子:
1.比如有一个排序要求,把对象构成的数组按照某种要求进行排序。如果此时需要的排数的是整数数组,要求数字按照从小到大顺序排列,可以通过一个静态sort方法用任意排序算法实现此功能。


2.如果此时要求排序的是其他对象呢,比如对小猫对象进行排序?当然可以重新写一个sort方法,专门对小猫的身高排序。问题得到解决。但如果又需要对小狗对象进行排序呢?难道又要针对小狗专门写一个sort算法?用户肯定会很郁闷,因为算法大部分都一样,就是比较的具体实现不一样。所以就考虑用多态解决吧。定义一个compareable接口,需要排序的类都必须实现此接口的compareTo方法,它只有一个参数(待比较的对象),compareTo方法只做一件事,即当this比参数中的对应值大则返回1,小返回-1,相等就返回0。compareTo方法相当于是将不同情况下算法不同的部分提出来了,在sort方法中将待比较的两个对象都强转为compareable(多态的威力就爆发出来了),在方法内部使用compareTo方法自动就会关联到具体类中的实现。这样算法就统一了。以后,增加新的比较只需要在对象类上实现compareable接口,实现compareTo方法即可。


3.以上只是解决了不同类型的对象都使用相同的比较算法进行排序而已,其实啊,只是基础,和策略模式关系不大。假如相同的对象要使用不同的比较呢?例如,小猫开始要使用身高进行排序,然后又要使用体重进行排序,怎么办?此时策略模式闪亮登场。


4.思考:是这样的,假如我们事先定义好按照某种方式进行排序,就像上面一样,那不就定死了吗,要根据其他属性进行比较,只能生改代码不是么?这样的话,每次改变属性就要修改代码,严重违背了开放-封闭原则。于是再一次考虑使用多态,多态多态多么变态!首先定义一个Comparetor接口,它有一个compare方法待实现。然后在类中增加一个类型为Comparetor的localComparetor属性(或者叫字段),再增加对localComparetor属性的get和set方法。当需要修改具体比较策略时,直接调用对localComparetorset方法,达到修改localComparetor的目的。至于compareTo方法中做的事情,直接写成localComparetor的比较动作,也就是说原来写死的比较方法转移给了localComparetor去做。localComparetor只是实现了Comparetor接口的类。到此完成。


5.当需要增加新的比较策略时,首先定义一个新类实现Comparetor接口,然后调用localComparetor的set方法(新类的对象作为参数)。这样就把具体用什么作为比较因素改过来了,实现动态切换。符合开放-封闭原则,扩展性好。


总结:此例子两次使用多态,不但比较的对象用多态,同一种对象的比较因素也可以使用多态。难怪说多态是设计模式基础和核心啊。每次增加类型或者比较因素时,只需添加新类型和调用一下方法即可,而无需硬生生修改代码。











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值