设计模式之 策略模式
来源:互联网 发布:剑灵可爱萝莉捏脸数据 编辑:程序博客网 时间:2024/06/05 01:58
策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口!
比如,我要回家,可以步行,可以打车,可以坐公车!
首先定义一个小明回家的策略接口:
public interface GoHomeStrategy {public void goHome();}
public class GoHomeByTaxiStrategy implements GoHomeStrategy {@Overridepublic void goHome() {System.out.println("打车回家回家");}}
钱不多的时候 坐公车回家
public class GoHomeByBusStrategy implements GoHomeStrategy {@Overridepublic void goHome() {System.out.println("坐公车回家");}}
没钱的时候,走路回家(可怜的娃)
public class GoHomeByWalkStrategy implements GoHomeStrategy {@Overridepublic void goHome() {System.out.println("步行回家");}}
这里顶一个环境类,让用户决定使用哪一种解决方案
public class GoHomeContext {private GoHomeStrategy mGoHomeStrategy;public GoHomeContext(GoHomeStrategy mGoHomeStrategy){this.mGoHomeStrategy = mGoHomeStrategy;}//修改回家方案public void setGoHomeStrategy(GoHomeStrategy mGoHomeStrategy){this.mGoHomeStrategy = mGoHomeStrategy;}public void goHome(){mGoHomeStrategy.goHome();}}
测试类
public static void main(String[] args) { GoHomeContext mGoHomeContext = new GoHomeContext(new GoHomeByBusStrategy());mGoHomeContext.goHome();System.out.println("现在改成");mGoHomeContext.setGoHomeStrategy(new GoHomeByWalkStrategy());mGoHomeContext.goHome();}
本来小明选的是打车回家的方案,可是一摸口袋钱包被偷了,公车都没发坐,只好改成了走路回去!
打印结果!
坐公车回家现在改成步行回家
下面几句话来自(http://www.cnblogs.com/java-my-life/archive/2012/05/10/2491891.html)
策略模式的优点
(1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
(2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。
策略模式的缺点
(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
(2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。
0 0
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 写一个宏将一个数的奇数位和偶数位交换
- TextView部分文字设置指定颜色和大小和字体
- 服务器IO多路复用模型
- HDU 1850 Being a Good Boy in Spring Festival
- HDU 1049Climbing Worm 解题报告
- 设计模式之 策略模式
- JavaScript 命名空间
- java Date常用操作方法
- Groovy字符串及其常用方法
- 1008. 数组元素循环右移问题 (20)——数组循环移动算法
- kmp算法--通俗易懂
- 管道的相关知识
- Java LinkedList、ArrayList、Vector、Map、HashMap、HashTable总结
- Linux(Ubuntu+CentOS)下安装Git