10设计模式策略模式

itplay itplay     2023-03-09     786

关键词:

前言

在软件领域中,设计模式作为一种经典的开发实践常常需要我们去深入的理解,而策略模式作为设计模式的一种,使用频率也是相对来说比较高的,在Java中,当我们学习TreeSet集合的时候,就采用了经典的策略模式的思想,本文主要讲解策略模式。

概念

其思想是针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换。策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能。

特点

策略模式体现了面向对象程序设计中非常重要的两个原则:

封装变化的概念。编程中使用接口,而不是使用的是具体的实现类(面向接口编程)。

举例:我们就以Java中的TreeSet为例,TreeSet仅仅知道它只是接收一个Comparator这种接口类型,但是具体是哪种实现类,TreeSet并不关心,实现类在真正的传入TreeSet之前,TreeSet本身是不知道的,所以我们可以自己去实现Comparator接口,然后在实现类里面去封装好我们自己的规则(这里的规则你可以当做是算法),比如说我们要实现对一个集合的元素排序,但是到底是要升序排序还是降序排序,这个完全由我们来去控制,我们可以把这种变化的内容封装到自己的实现类中,真正运行的时候才知道具体的实现。

技术图片

组成

 

抽象策略角色这个是一个抽象的角色,通常情况下使用接口或者抽象类去实现。对比来说,就是我们的Comparator接口。具体策略角色包装了具体的算法和行为。对比来说,就是实现了Comparator接口的实现一组实现类。环境角色内部会持有一个抽象角色的引用,给客户端调用。对比来说,就是我们的TreeSet类。说明:TreeSet内部一定会有一个策略类的一个成员变量,这样做的目的在于可以当我们在去创建TreeSet对象的时候,可以接收我们向TreeSet类中传递的具体的策略类。

编写步骤

定义抽象策略角色(为策略对象定义一个公共的接口)编写具体策略角色(实际上就是实现上面定义的公共接口)定义环境角色,内部持有一个策略类的引用

案例

实现一个加减乘除的功能。

1、定义抽象策略角色

技术图片定义抽象策略角色

2、定义具体策略角色(本例子仅仅演示,只是定义加、减两种具体策略)

加法策略:

技术图片

减法策略:

技术图片

3、环境角色

 

技术图片

4、测试类

 

技术图片

总结

通过案例的形式相信大家已经对策略模式应该有所了解了吧,其实对比的理解去学习是可以快速上手的。不过在这里呢还是要多说一句,策略模式的缺点其实也很明显,在于策略模式把每一种具体的策略都封装成一个实现类,如果策略有很多的话,很显然是实现类就会导致过多,显得臃肿。其实每种设计模式都有它各种的优缺点,在这里呢,我们就要具体情况具体分析了。

10设计模式策略模式

前言在软件领域中,设计模式作为一种经典的开发实践常常需要我们去深入的理解,而策略模式作为设计模式的一种,使用频率也是相对来说比较高的,在Java中,当我们学习TreeSet集合的时候,就采用了经典的策略模式的思想,... 查看详情

工厂模式和策略模式有啥区别?

】工厂模式和策略模式有啥区别?【英文标题】:WhatisthedifferencebetweenFactoryandStrategypatterns?工厂模式和策略模式有什么区别?【发布时间】:2010-10-1115:14:27【问题描述】:谁能解释工厂模式和策略模式之间的区别?对我来说,除... 查看详情

桥接模式和策略模式有啥区别?

】桥接模式和策略模式有啥区别?【英文标题】:Whatisthedifferencebetweenthebridgepatternandthestrategypattern?桥接模式和策略模式有什么区别?【发布时间】:2010-10-0215:31:20【问题描述】:我尝试阅读dofactory、***和许多网站上的许多文章... 查看详情

设计模式---004策略模式---巷子(代码片段)

一、设计模式概念  设计模式所强调的是代码的结构设计和解决问题的思路 二、策略模式  策略模式:所有的解决方案我们都应该提前设定好,不在根据当下的情形做判断,将不同的问题及不同的解决方案对应起来。&nb... 查看详情

java设计模式-策略模式

1.1需求背景Background:M公司为某电影院开发了一套影院售票系统,在该系统中需要为不同类型的用户提供不同的电影票打折方式,具体打折方案如下:(1)学生凭学生证可享受票价8折优惠;(2)年龄在10周岁以及以下的儿童可... 查看详情

策略模式(代码片段)

...入解决方案代码体现packagecom.xnn.strategy;/****类(接口)描述:策略接口,所有的具体策略都得实现这个接口*@authorxnn*2018年11月4日下午10:31:14*/publicinterfaceStrategypublicdoublecost(doublenum);packagecom.xnn.strategy;/****类(接口)描述:其 查看详情

模板方法和策略模式有啥区别?

】模板方法和策略模式有啥区别?【英文标题】:Whatisthedifferencebetweenthetemplatemethodandthestrategypatterns?模板方法和策略模式有什么区别?【发布时间】:2010-10-1417:34:50【问题描述】:谁能给我解释一下模板方法模式和策略模式有什... 查看详情

[设计模式]策略模式(strategy)

referenceto: http://www.cnblogs.com/spring5/archive/2011/10/20/2485291.html一、概要我们构建程序的时候,会遇到这样的状况,对象有某个行为,但是在不同的场景中,使用策略模式,可以把它们一个个封装起来,并且使它们可相互替换,而... 查看详情

大话设计模式之策略模式(代码片段)

背景:商场促销期间,可能会出现8折、5折的促销活动,也可能出现满100减10、满200减30的促销活动,设计一个收银系统。策略模式:定义了算法家族,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户。... 查看详情

策略模式与继承的区别

】策略模式与继承的区别【英文标题】:DifferencesbetweenStrategyPatternandInheritance【发布时间】:2014-10-3120:21:52【问题描述】:StrategyPattern和Inheritance有相同的概念,所以我可以用Inheritance实现StrategyPattern,听起来它比StrategyPattern更简... 查看详情

经典案例python详解设计模式:策略模式(代码片段)

完成一项任务往往有多种方式,我们将其称之为策略。比如,超市做活动,如果你的购物积分满1000,就可以按兑换现金抵用券10元,如果购买同一商品满10件,就可以打9折,如果如果购买的金额超过500,就可以享受满减50元的优... 查看详情

重構電商例子(策略模式)

案例分析:重构“策略”模式《设计模式:可复用面向对象软件的基础》一书是这样概述“策略”模式的:定义一系列算法,把它们一一封装起来,并且使它们可以相互替换。本模式使得算法可以独立于使用它的客户而变化。假如一个... 查看详情

java策略模式与接口直接实现

java策略模式例子:https://www.cnblogs.com/java2016/p/5386615.htmlContextcontext=newContext(newAddStrategy());System.out.println(context.calculate(10,5));与Strategys=newAddStrategy();s.calcuate(10,5);的优劣怎么比较?谢谢!我是一个java初学者,我下面写的东西都是我... 查看详情

win10想开测试模式,提示“设置元素数据时出错。该值受安全引导策略保护无法

...测试模式,提示“设置元素数据时出错。该值受安全引导策略保护无法可能程序不兼容,可以更换个版本试试。另外建议参考下程序对配置的要求。或者右键需要运行的程序选择兼容性用兼容模式运行试试。参考技术A实测。需要... 查看详情

设计模式—策略模式

策略模式主要内容:策略模式是什么?策略模式解决了什么问题?如何实现策略模式?实际应用中的策略模式。1.策略模式是什么?定义:策略模式定义了算法族,分别封装起来,让它们之间可以互相替换。此模式让算法的变化... 查看详情

简说设计模式——策略模式(代码片段)

一、什么是策略模式  策略这个词应该怎么理解,打个比方说,我们出门的时候会选择不同的出行方式,比如骑自行车、坐公交、坐火车、坐飞机、坐火箭等等,这些出行方式,每一种都是一个策略。  再比如我们去逛商场... 查看详情

设计模式---策略模式(代码片段)

...f0c;每一条途径对应一种算法,此时我们可以使用一种设计模式来实现灵活地选择解决途径,也能够方便地增加新的解决途径。策略模式包含角色Contex 查看详情

如何强制 Azure 策略中主机名的名称模式?

】如何强制Azure策略中主机名的名称模式?【英文标题】:HowtoforceNamepatternforHostnamesinAzurepolicies?【发布时间】:2018-10-1510:57:56【问题描述】:Microsoft为Azure策略提供JSON模板:"properties":"displayName":"Hostnamepatternwithmatchcondition.","descrip... 查看详情