设计模式之策略模式
来源:互联网 发布:jquery字符串转换数组 编辑:程序博客网 时间:2024/05/16 14:30
设计模式的目的是为了增加代码的可重用性和提高软件的可维护性,软件开发中维护和更新的工作量比一开始的工作量大得多,所以说一个好的设计模式有时候是非常必要的,首先让我们来简单介绍设计模式中的策略模式。本系列中的模式来源于Head First设计模式一书中,加上自己学习过程中的心得体会。
策略就是用来解决问题的,不同的问题就有不同的策略去解决,所以对于一个类似的问题但不同个体会采取不同策略来解决的情况,我们就可以采取策略欧式来解决。比如树中提到的鸭子的模型,鸭子怎么叫就是一个要解决的问题,不同的鸭子有不同的叫法,我们可以把鸭子叫的方式独立出来写成一个接口,然后对这个借口实现各种策略,比如呱呱叫,比如嘎嘎叫等等,要用到鸭子叫的时候就直接调用这些策略就ok了。
下面具体看一下用JAVA如何实现这种模式,先看一下类图
图中对策略进行了封装,封装成Strategy的一个接口,然后里面有一个work的方法可以实现策略,有三个具体的类StrategyOne,StrategyTwo,StrategyThree分别实现了Strategy接口,它们的策略处理方式也不一样。然后就是StrategyMode类,它有一个Strategy对象用于管理策略,有一个构造函数也有一个展示策略的方法,它可以把它的对象strategy赋值为任意一种策略StrategyOne,StrategyTwo,StrategyThree,然后就可以实现相应的功能,这就是策略模式的简单介绍。
其实策略模式也就是定义了一堆的算法簇,然后你要实现什么功能,你就只要在算法簇中选择出你自己想要的算法就可以了。
下面给出具体各个类的实现:
Strategy接口的实现
package StrategyMode;public interface Strategy {//实现策略的方法public void work();}
StrategyMode类的实现
package StrategyMode;public class StrategyMode {private Strategy strategy = null;public StrategyMode(){//选择策略strategy = new StrategyOne();//strategy = new StrategyTwo();//strategy = new StrategyThree();}public void performStrategy(){strategy.work();}public static void main(String [] args){StrategyMode mode = new StrategyMode();mode.performStrategy();}}
StrategyOne,StrategyTwo,StrategyThree的实现
package StrategyMode;class StrategyOne implements Strategy {@Overridepublic void work() {//do somethingSystem.out.println("I am strategy one!");}}class StrategyTwo implements Strategy {@Overridepublic void work() {// do somethingSystem.out.println("I am strategy two!");}}class StrategyThree implements Strategy {@Overridepublic void work() {// do somethingSystem.out.println("I am strategy three!");}}
策略模式优缺点:
优点
1、 提供了一种替代继承的方法,而且既保持了继承的优点(代码重用),还比继承更灵活(算法独立,可以任意扩展);
2、 避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展;
3、 遵守大部分GRASP原则和常用设计原则,高内聚、低偶合;
4、 易于进行单元测试,各个算法区分开,可以针对每个算法进行单元测试;
缺点
1、 因为每个具体策略类都会产生一个新类,所以会增加系统需要维护的类的数量;
2、 选择何种算法需要客户端来创建对象,增加了耦合,这里可以通过与工厂模式结合解决该问题;
3、 程序复杂化。
设计原则:
1.找出应用中可能变化之处,把它们独立出来,不要跟那些不能独立的代码混在一起;
2.针对接口编程,不针对实现编程;
3.多用组合,少用继承。
谢谢
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 第15周项目1-打入“内部”寻“内幕”
- iOS开发UI篇—控制器的创建
- 点击小球游戏
- 22读取联系人
- 死理性派
- 设计模式之策略模式
- 研读Java代码必须掌握的Eclipse快捷键
- 中国电信业转型的第三个风向标
- ThinkPHP使用技巧
- sphinx 增量索引 实现近实时更新
- 几种输入输出方式的区别
- JQuery一个checkbox实现全选/全不选,取消子checkbox时,全选checkbox取消对号
- 灵感1
- 载波聚合、LTE-Hi浮出水面 抢占LTE-A演进制高点