在软件开发中,设计模式是为了解决常见问题而提供的一套可重用的解决方案。策略模式(Strategy Pattern)是其中一种常见的设计模式,它属于行为型模式。该模式的核心思想是将不同的算法封装成独立的策略类,使得它们可以相互替换,而不影响客户端的使用。
策略模式与其他设计模式有一些明显的区别。与模板方法模式相比,策略模式强调算法的灵活性,允许在运行时切换不同的策略。与状态模式相比,策略模式更注重不同算法之间的替换性,而非状态的内部转换。
在Java编程语言中,实现策略模式需要以下几个关键元素:策略接口、具体策略类和环境类。
首先,定义一个策略接口,其中包含策略类共有的方法。例如:
public interface Strategy {
void execute();
}
接下来,创建具体策略类,实现策略接口并实现具体的算法。例如:
public class ConcreteStrategyA implements Strategy {
@Override
public void execute() {
// 具体算法A的实现
}
}
public class ConcreteStrategyB implements Strategy {
@Override
public void execute() {
// 具体算法B的实现
}
}
然后,定义一个环境类,用于持有策略对象并在运行时切换不同的策略。例如:
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void executeStrategy() {
strategy.execute();
}
}
通过以上实现,我们可以根据需要选择不同的具体策略类,并通过环境类进行调用。例如:
Strategy strategyA = new ConcreteStrategyA();
Context context = new Context(strategyA);
context.executeStrategy();
Strategy strategyB = new ConcreteStrategyB();
context.setStrategy(strategyB);
context.executeStrategy();
策略模式适用于以下场景:
策略模式是一种灵活的行为型设计模式,通过封装不同的算法成为独立的策略类,使得这些算法可以在运行时相互替换。通过定义策略接口、具体策略类和环境类,我们可以在Java中实现策略模式。该模式具有灵活性高、易于扩展和维护等优点,适用于需要动态切换算法或封装具体算法的场景。然而,策略模式也需要客户端了解不同的策略类,增加了复杂度,并可能导致系统庞大。
总而言之,策略模式是一种强大而灵活的设计模式,可以提供可复用的算法解决方案。通过合理地应用策略模式,我们可以提高代码的灵活性、可扩展性和可维护性,从而更好地应对不同的业务需求。
大家好,又见面了,我是你们的朋友全栈君。1、为什么要热部署大家在进行web开发的时候,都希望自己修改的内容在不手动编译、不重启服务的时候立即生效,这样可以极大的方便开发和调试。这个就是我今天要讲的weblogic的热部署。一.Weblogic热部署相关配置项 Weblogic能实现热部署功能,而且有自己的热部署机制,一般的应用在Weblogic的控制台中有如下三个配置项: servlet-reload-check-secs resource-reload-check-secs JSPpage-check-secondsxml配置:<?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEweblogic-web-appPUBLIC"-//BEASystems,Inc.//DTDWebApplication8.1//EN""http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
服务端命令SQL在数据库系统中,SQL语句不区分大小写(建议用大写) SQL语句可单行或多行书写,以“;”结尾 关键词不能跨多行或简写 用空格和缩进来提高语句的可读性 子句通常位于独立行,便于编辑,提高可读性 注释: SQL标准: /*注释内容*/多行注释 --注释内容单行注释,注意有空格 MySQL注释: #SQL优化查询时,能不要*就不用*,尽量写全字段名 大部分情况连接效率远大于子查询 多表连接时,尽量小表驱动大表,即小表join大表 在千万级分页时使用limit 对于经常使用的查询,可以开启缓存 多使用explain和profile分析查询语句 查看慢查询日志,找出执行时间长的sql语句优化sql查询:单表查询和多表查询两张表合并:横向合并、纵向合并纵向合并:两张表挑出相同的字段进行合并(注意顺序)范例SQL查询范例1、给表的字段名添加别名 selectstuidas学生编号,name姓名,gender性别fromstudents; 2、查询年龄大于40的 select*fromstudentswhereage>40; 3、查找年龄大于20小于4
大家好,又见面了,我是全栈君。这一次我们将会实现一个完整纯粹的自己定义控件,而不是像之前的组合控件一样。拿系统的控件来实现。计划分为三部分:自己定义控件的基本部分,自己定义控件的触摸事件的处理和自己定义控件的自己定义属性;以下就開始第一部分的编写。本次以一个定义的开关button为例。以下就開始吧:先看看效果,一个点击开关button。实现点击切换开关状态:为了可以解说清晰,还是来一些主要的介绍。首先须要明白的就是自己定义控件还是继承自View这个类,Google在View这个类里面提供了相当多的方法供我们使用,使用这些方法我们能够实现相当多的效果和功能。在这里须要用到几个基本的方法。自己定义控件的步骤、用到的主要方法:1、首先须要定义一个类。继承自View;对于继承View的类,会须要实现至少一个构造方法;实际上这里一共同拥有三个构造方法:publicView(Contextcontext)是在java代码创建视图的时候被调用(使用new的方式),假设是从xml填充的视图,就不会调用这个 publicView(Contextcontext,AttributeSetattrs)这个是在
MaximalSquareDesicriptionGivena2Dbinarymatrixfilledwith0’sand1’s,findthelargestsquarecontainingonly1’sandreturnitsarea.Example:Input: 10100 10111 11111 10010 Output:4复制SolutionclassSolution{ public: intmaximalSquare(vector<vector<char>>&matrix){ if(matrix.empty()) return0; introw_size=matrix.size(); intcol_size=matrix[0].size(); vector<int>left(col_size,0); vector<int>right(col_size,col_size); vector<int>height(col_size,0); intres=0; for(inti=0;i<row_size;i
前面几篇文章用Java带大家一起了解了几个游戏小项目,感兴趣的小伙伴可以点击文章观摩下,手把手教你用Java打造一款简单故事书(上篇)、手把手教你用Java打造一款简单故事书(下篇)、手把手教你用Java打造一款简单考试系统(上篇)、手把手教你用Java打造一款简单考试系统(下篇)、手把手带你用Java打造一款对对碰游戏(上篇)、手把手带你用Java打造一款对对碰游戏(下篇)、手把手带你用Java实现点灯游戏(上篇)、手把手带你用Java实现点灯游戏(下篇),接下来的几篇文章是关于Java基础的,希望对大家的学习有帮助,欢迎大家在讨论区留言。一、内部类(一)什么是内部类?可以在类中再定义类,就叫做内部类,这个内部类所在的类,就叫做外部类。(二)内部类作用1.内部类提供更好的封装,把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类。2.内部类成员可以直接访问外部类的私有数据,因为内部类被当成外部类的成员。然而外部类不能访问内部类的实现细节(如内部类的成员变量)。二、成员内部类1.什么是成员内部类在一个类中可以定义成员变量、成员方法外,还可以定义类就叫做成员内部类。成员内部类可以访
//MySQL的两个主要分支//今天说点儿概念性的东西,关于MySQL的两个最流行的分支,MariaDB和PerconaServer,这两个分支其实都有自己的优缺点,这里简单介绍一下分支产生的原因,或许可以帮助大家在实际生产环境中确认到底使用哪一个。开始之前,我们首先截取一个当前数据库使用流行度的一个图,来简单分析下这两个分支现在的使用情况,图截取自DB-Engine网站:这里友好的贴出连接:https://db-engines.com/en/ranking从图中可以看到,官方的MySQL的用户量最多,接下来是MariaDB,他排在第13位,那么perconaserver呢,看看排名:它的排名在96位,这可以大概看出来当前这几种数据库的流行程度。01MariaDB简介首先我们简单介绍一下MariaDB和PerconaServer,先从MariaDb开始,MariaDB数据库是MySQL的一个分支,它由MySQL的创始人MontyWidenius(以下简称MW)主导开发,MariaDB选自她女儿的名字,2008年Sun公司用10亿美金收购了MySQL,但是由于各种原因,Sun公司又将My
木又连续日更第71天(71/100)木又的第119篇leetcode解题报告二叉树类型第9篇解题报告leetcode第107题:二叉树的层次遍历IIhttps://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii/【题目】给定一个二叉树,返回其节点值自底向上的层次遍历。(即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如: 给定二叉树[3,9,20,null,null,15,7], 3 /\ 920 /\ 157 返回其自底向上的层次遍历为: [ [15,7], [9,20], [3] ] 复制【思路】本题与【T115-二叉树的层次遍历】几乎一样,最后将结果进行翻转即可。【代码】python版本#Definitionforabinarytreenode. #classTreeNode(object): #def__init__(self,x): #self.val=x #self.left=None #self.right=None classSolution(object): deflevelOr
1..ignore地址:https://plugins.jetbrains.com/plugin/7495--ignore生成各种ignore文件,一键创建gitignore文件的模板,免得自己去写截图:2.lombok地址:https://plugins.jetbrains.com/plugin/6317-lombok-plugin支持lombok的各种注解,从此不用写gettersetter这些可以把注解还原为原本的java代码非常方便截图:3.p3c地址:https://plugins.jetbrains.com/plugin/10046-alibaba-java-coding-guidelines阿里巴巴出品的java代码规范插件可以扫描整个项目找到不规范的地方并且大部分可以自动修复更多可看:https://github.com/alibaba/p3c/tree/master/idea-plugin4.FindBugs-IDEA地址:https://plugins.jetbrains.com/plugin/3847-findbugs-idea检测代码中可能的bug及不规范的位置
作者:刘晨 网名bisal,具有十年以上的应用运维工作经验,目前主要从事数据库应用研发能力提升和技术管理相关的工作,OracleACE,腾讯云TVP,拥有OracleOCM&OCP、EXINDevOpsMaster、SCJP等国际认证,国内首批OracleYEP成员,OCMU成员,《DevOps最佳实践》中文译者之一,CSDN&ITPub专家博主,公众号"bisal的个人杂货铺",长期坚持分享技术文章,多次在线上和线下分享技术主题。本文来源:原创投稿*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。同事提了一个MySQL数据库中SQL统计数据的问题,我用测试数据模拟一下,如下所示,表tt有三个字段,code是标识名称,cdate是对应的日期,ctotal是个统计值原始的统计语句如下所示,按照code和cdate进行聚类,统计出每个code每个月累加的记录数,但是他的需求是能按照code+cdate的统计值进行累加显示,例如上图中第一行的total是10,第二行的total就显示10+9=19,第三行的total就显示10+
最近在研究clover引导黑苹果时无意发现了一款能够在windows下编辑UEFI引导顺序的软件EasyUEFI。EasyUEFI除了能够修改UEFI引导顺序外,还能够创建或者编辑windows/Linux的UEFI引导信息。如果UEFI引导损坏,EasyUEFI还能够创建USBUEFI引导磁盘对计算机进行急救。 EasyUEFI主界面,左侧为引导顺序,可以点击中列的向上或向下按钮进行排序。除了UEFI引导的windowsbootmanager项,还能够看到USB引导以及网络引导。右侧为引导项详细信息,包括分区GUID,文件路径等。 下部为所有已连接磁盘的分区情况,选中引导项后对应的分区会被标红。 点击编辑后可对启动项进行编辑修改,目前功能仍比较简单,仅能够修改EFI文件位置。 点击创建可以添加UEFI引导项,包括Linux以及windows引导项。附带一提的是EasyUEFI所创建引导项支持引导clover。 随着UEFI主板越来越普及,类似EasyUEFI的小工具的确值得收藏备用。不过reizhi在笔记本上测试修改引导后出现了无法进入BIOS的现象,需要重刷才能恢复,不知是否个例
背景 昨天跟同事聊天,他提了一个问题,我觉得挺有意思,分享给大家。 原话是这样的:我提供了一个批量锁库存的接口,结果那谁传了十万条数据过来,把我弄死了,麻蛋,我就不应该给他提供这个批量的接口,我现在怎么办?(头大) 所以,我们应不应该提供批量的接口呢? 我认为不应该提供。 动机 首先,我们分析一下需要批量的动机。 客户端(调用者)想把数据组装成一个大List批量调用你的接口,肯定是考虑到如果一条一条调用你,中间的网络开销非常大,浪费很多时间,所以,他认为批量调用你的接口,可以把这一部分耗时给节约了,提高他接口的响应速度。 危害 然后,我们再分析一下如果你提供了批量接口,会出现哪些危害呢。 第一点,客户端相当于把他的压力转移到你这里了,整个系统出现问题,谁背锅,无需多言了。 第二点,本来客户端一个请求一个请求来调用你的,你可以部署10台机器来抗并发,结果现在一个请求过来10万数据,全部打到你的一台机器的一个线程中,你怎么处理?多线程?多线程你也是在一台机器里面搞。加消息队列再分发?这无疑大幅度增加了你的设计复杂度。 第三点,现在是10万数据,以后呢?会不会出现100万、1000万来调你?
[Paper] CARLA:AnOpenUrbanDrivingSimulator [Blog] CARLA:AnOpenUrbanDrivingSimulator [Web] CARLASimulator [Documentation] CARLA Documentation(latest),CARLASimulator(0.9.11) [Code] GitHub-carla-simulator/carla:Open-sourcesimulatorforautonomousdrivingresearch. [Install] Linuxbuild-CARLASimulator、Quickstartpackageinstallation-CARLASimulator、CARLAinDocker-CARLASimulator 参考链接:自动驾驶模拟器Carla不同平台编译(三)-知乎(zhihu.com) PythonAPI:史上最全Carla教程|(三)基础API的使用-知乎(zhihu.com) 更详细
自行编译jcef过程中遇到了一些问题,现在记录如下。 参考的主要文章是jcef的官方介绍: https://bitbucket.org/chromiumembedded/java-cef/wiki/BranchesAndBuilding 需要准备好以下环境: 1、python2.6 2、git 3、visualstudio2015 4、cmake2.8以上 5、java1.7以上 主要流程: 1、gitclone源码 #TheJCEFsourcecodewillexistat`/path/to/java-cef/src` cd/path/to/java-cef gitclonehttps://bitbucket.org/chromiumembedded/java-cef.gitsrc复制 注意,/path/to/指的是你的制定目录,不要有中文 2、执行cmake生成vs的sln项目文件 cd/path/to/java-cef/src mkdirjcef_build&&cdjcef_build cmake-G"VisualStudio14Win64
sutoringu 题意: 询问有多少一个字符串内有多少个个子区间,满足可以分成k个相同的串。 分析: 首先可以枚举一个长度len,表示分成的k个长为len的串。然后从1开始,每len的长度分成一块,分成(n-1)/k+1块,首先可以求出连续的k块的是否是合法。 此时只求了起点是1+len*i的串,还有些起点在块内的没有求。 枚举k-1个相同的块,设这些块为i...j,j-i+1=k。然后与求一下第i块和第i-1块最长后缀,设为a,求一下第j块和第j+1块的最长前缀,设为b。说明如果起点在第i-1块的串,必须是后面a个字符,这些串的终点必须是第j+1块的前b个字符。于是计算一下。 如何求连续的k块是否是一样的?可以求出这连续k块在的rank,然后取一个最大的rank和一个最小的rank,然后求之间的height最小值即可。 复杂度$nlog^2n$。 代码: #include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #inc
1<?xmlversion="1.0"encoding="UTF-8"?> 2<beansxmlns="http://www.springframework.org/schema/beans" 3xmlns:aop="http://www.springframework.org/schema/aop" 4xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5xsi:schemaLocation="http://www.springframework.org/schema/beans 6http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 7http://www.springframework.org/schema/aop 8http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> 9<!-- 101、引入AOP的命名空间 11xmlns:aop="http:/
按道理来说zabbix就自带的MySQL插件来监控mysql数据库,但是你会发现,自带的mysql监控项是很少的,根本满足不了公司的需求。由于它本身自带的模板太过简单了,所以需要做更详细的监控,而percona就提供了这个详细监控的模版以及脚本,解决了监控不全面的问题。percona插件是安装在zabbix-agent端的 1、percona插件安装: 首先需要下载php依赖: ubuntu@ubuntu:~$apt-getinstallphp 复制 1、官网下载percona包 https://www.percona.com/downloads/percona-monitoring-plugins/Version:percona的版本Software:linuxserver的版本DownloadAllPackagesTogether:一起下载所有包DownloadPackagesSeparately:单独下载某个包这里我们选择下载最后一个包-percona-zabbix-templates-1.1.7-1.xenial_all.ded 2、命令下载 ubuntu@ubuntu:
1.安装LiferayIDE:打开Eclipse的Help-->EclipseMarketplace,在下图所示搜索框中输入liferay,回车搜索: 搜索结果如下图所示: 点击install安装,安装完成后,在windows-->preferences中可找到Liferay的面板,如下所示: 注:其他安装方法: 一,直接下载LiferayIDE,下载地址http://www.liferay.com/zh/downloads/liferay-projects/liferay-ide,下载后可直接打开使用; 二,至http://www.liferay.com/zh/downloads/liferay-portal/available-releases下载eclipse插件,下载后在你的eclipse中安装。 2.安装相关插件,包括liferay-plugins-sdk-6.1.1(PluginsSDK)、liferay-portal-6.1.1-ce-ga2(BundledwithTomcat)和
今天做代码审查时,看见以下一段触发器的创建脚本,我们一起来分析一下 createtrigger[trigger_puClassRoomType] on[dbo].[puClassRoomType] AFTERupdate as declare@roomnamenvarchar(100),@roomnumbernvarchar(100) select@roomname=TypeName,@roomnumber=TypeNumberfromInserted begin updateExamingClassessetTypeName=@roomnamewhereTypeNumber=@roomnumber updatePlanNumTimePlacesetClassroomName=@roomnamewhereClassroomnum=@roomnumber end go复制 书写这段代码的程序员可能对1、SQLServer变量赋值2、触发器Inserted表这两个概念模糊,首先我们谈谈Inserted表,代码段中对Inserted表的查询方式没有带任何条件,似乎这张
转载自:http://mobile.51cto.com/iphone-285371.htm iPhone这类移动设备内存有限,而又不能使用交换区,为了不至于导致内存不足而引起运行效率降低或应用崩溃,有时候需要获取当前的内存状况,以决定采用的缓存策略。 AD:2014WOT全球软件技术峰会北京站课程视频发布 由于iPhone这类移动设备内存有限,而又不能使用交换区,为了不至于导致内存不足而引起运行效率降低或应用崩溃,有时候需要获取当前的内存状况,以决定采用的缓存策略。 不过iOSSDK文档里并没有提及这种底层的API,于是我搜了一番,找到了host_statistics()这个函数。 参数虽然很多,但基本上都是固定的值,我也就不解释,直接上代码了: #include <mach/mach.h> BOOL memoryInfo(vm_statistics_data_t *vmStats) { mach_msg_t