当前位置: 首页 > news >正文

Java设计模式之策略设计模式

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

相关文章:

  • 你该为产品设计怎样的气质
  • 敲代码需要一丝不苟,Node静态化,ejs文件里多了一条外联下的Bug问题
  • centos7 虚拟机安装docker-ce-17.09
  • 加权有向图问题2----多源最短路径问题(Floyd算法)和关键路径算法
  • 021——VUE中变异方法 push/unshift pop/shift
  • P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反)
  • 泛型的继承和通配符,同时归纳集合部分的面试点
  • VS 之 InstallShield Limited Edition for Visual Studio 2015 图文教程
  • utf
  • shell 并发进程的例子
  • 新手练练----也做即时通信系统(1)
  • 2017双11技术揭秘—分布式缓存服务Tair的热点数据散列机制
  • 8.不绑定(ngNonBindable)
  • spring boot 2.0之使用spring boot
  • ELK实战之Tomcat的json日志收集
  • ----------
  • Brief introduction of how to 'Call, Apply and Bind'
  • JavaScript设计模式系列一:工厂模式
  • jdbc就是这么简单
  • JDK 6和JDK 7中的substring()方法
  • JSONP原理
  • leetcode98. Validate Binary Search Tree
  • SpringBoot几种定时任务的实现方式
  • Sublime text 3 3103 注册码
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 闭包--闭包之tab栏切换(四)
  • 简单数学运算程序(不定期更新)
  • 七牛云假注销小指南
  • 时间复杂度与空间复杂度分析
  • 听说你叫Java(二)–Servlet请求
  • 携程小程序初体验
  • 正则表达式
  • Java性能优化之JVM GC(垃圾回收机制)
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 湖北分布式智能数据采集方法有哪些?
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​用户画像从0到100的构建思路
  • # 数据结构
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (六)激光线扫描-三维重建
  • (十六)串口UART
  • (四)Controller接口控制器详解(三)
  • (转载)PyTorch代码规范最佳实践和样式指南
  • *上位机的定义
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .Net - 类的介绍
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET 反射 Reflect
  • .NET 使用配置文件
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法