博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java设计模式之策略设计模式
阅读量:5855 次
发布时间:2019-06-19

本文共 2407 字,大约阅读时间需要 8 分钟。

1.什么是-策略设计模式

在软件开发中常常遇到这种情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择。
这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。如果我们将这些策略包含在客户端,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。

2.策略设计模式的优缺点

1.1优点

1.1.1.可以动态的改变对象的行为

1.1.2.分离业务逻辑实现和需求 

1.2缺点

1.2.1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类

1.3.2.策略模式将造成产生很多策略类

2.设计模式示例

2.1.示例背景

这里的示例是以小明和女朋友出去旅游选择交通工具做背景,之前设计模式职责链的时候小明已经请假相亲,结婚啥的都已经做完了,结完婚是不是该出去度蜜月了。一天小明决定去马尔代夫度蜜月,然后选择交通方式的时候犯愁了,小明是一位选择性强迫症的人,他在考虑是坐汽车还是火车还是飞机呢。他决定吧这三个想法告诉他的老婆小红,让小红来决定(Context类来充当这个角色)。三个交通工具类分别是:Aircraft-飞机,Automobile-汽车,Train-火车,每一种交通工具的最终目的都是为了出行,所以定义一个抽象类Travel 并定义抽象方法TravelInterface让三个交通工具实现该方法

2.2.代码区域

2.2.1.创建抽象类Travel 定义抽象方法

/** * 出行抽象类 */public abstract class Travel {    /**     * 出行抽象的公共接口方法     */    public abstract   void TravelInterface();}

2.2.2.创建火车类并实现抽象Travel 类

/** * 火车类 */public class Train extends Travel  {    @Override    public void TravelInterface() {        System.out.println("我选择乘坐火车去旅游");    }}

2.2.3.创建汽车类并实现抽象Travel 类

/** * 汽车类 */public class Automobile extends Travel  {    @Override    public void TravelInterface() {        System.out.println("我选择乘坐汽车去旅游");    }}

2.2.4.创建飞机类并实现抽象Travel 类

/** * 飞机类 */public class Aircraft extends Travel {    @Override    public void TravelInterface() {        System.out.println("我选择乘坐飞机去旅游");    }}

2.2.4.创建实现抽象出行的实现类-小明的媳妇

/** * 控制中心 */public class Context {    public void setStrategy(Travel strategy) {        this.strategy = strategy;    }    private Travel strategy;    public Context(Travel strategy) {        this.strategy = strategy;    }    public void TravelInterface(){        this.strategy.TravelInterface();    }}

2.2.5.创建小明测试类

/** * 出行选择对应的出行方式 */public class TourismTest {    public static void main(String args[]) {        Context context=null;        context=new Context(new Aircraft());/*通过传递某个出行对象来决定真正出行的交通工具*/        context.TravelInterface();        context=new Context(new Train());        context.TravelInterface();        context=new Context(new Automobile());        context.TravelInterface();    }}

执行思路总结:从实例中可以看出来优缺点的确很明显,本身出行的交通工具都是可以划分为交通工具类的,只是动作方法实现不同,这也就是缺点策略模式将造成产生很多策略类。有没有发现策略模式和职责链模式有几分相似之处。这里小明发起请求最终再交给小红来实现,小红就是Context 这个类。

 

转载于:https://www.cnblogs.com/david97/p/8081338.html

你可能感兴趣的文章
软件开发过程学习笔记(四)之详细设计说明书模板 分类: 开发过程 ...
查看>>
vs的【warning C4996:'fopen': This function or variable may be unsafe】解决方案
查看>>
[LUOGU] P2245 星际导航
查看>>
【转】TabError:inconsistent use of tabs and spaces
查看>>
基于人脸识别的商业大数据14
查看>>
Class.forName("com.mysql.jdbc.Driver");的作用
查看>>
C# 泛型
查看>>
功能测试
查看>>
django的queryset和objects对象
查看>>
Dubbo架构设计简单了解
查看>>
网络编程:基于C语言的简易代理服务器实现(proxylab)
查看>>
badboy录制网站出现css样式混乱,网页的图标点击没反应
查看>>
步步为营 .NET 设计模式学习笔记系列总结
查看>>
WIN2008服务器不能复制粘贴怎么办
查看>>
链路层
查看>>
unity工具IGamesTools之批量生成帧动画
查看>>
Thread和Runnable
查看>>
多系统盘挂载
查看>>
【备忘】关于rm删除命令
查看>>
如何查看当前Ubuntu系统的版本
查看>>