策略模式

设计模式:策略模式

旧巷老猫 提交于 2019-12-22 16:52:18
之前的设计模式帖子 设计模式系列目录 今天说一下策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户 换句话说策略模式,是指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法,比如吃东西的行为,有的人喜欢狼吞虎咽,有的人 喜欢细嚼慢咽,有的人喜欢边吃边说 策略模式的重心不是如何实现算法,而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。 看一下简单的代码实现 #region 策略模式 #region 抽象策略 public abstract class Stratety { public abstract void StrategyInterface();//子类要实现的方法 } #endregion #region 具体策略 public class ConcreteStrategyA:Stratety { public override void StrategyInterface() { Console.WriteLine("A:类A的实现方法"); } } public class ConcreteStrategyB : Stratety { public override void StrategyInterface() { Console.WriteLine("B:类B的实现方法"); }

策略模式的孪生兄弟---状态模式

 ̄綄美尐妖づ 提交于 2019-12-22 09:14:10
人的机缘是神奇的,认识一个人就相当于打开了一个圈子,不管这个人是否在圈子中心,而这点,会在不经意间带给我们意想不到的作用。 如果我们在编写代码的时候,遇到大量的条件判断的时候,可能会采用策略模式来优化结构,因为这时涉及到策略的选择,但有时候仔细查看下,就会发现,这些所谓的策略其实是对象的不同状态,更加明显的是,对象的某种状态也成为判断的条件。 我们还是以一个例子入手。 假设现在我们有一个饮水机,它有以下两个状态: 满桶,空桶。初始状态是满桶,容量是20。饮水机只有一个动作:press,每次press后都会使容量减1,一旦为0,则将状态设置为空桶,这时press没有水流出。 要使用状态模式,我们必须明确两个东西:状态和每个状态下执行的动作。就像是饮水机,最基本的状态就是满桶和空桶,而这两个状态下,都可能要执行倒水这个动作,也就是press。如果饮水机的容量为0,则会进入空桶的状态。 在状态模式中,因为所有的状态都要执行相应的动作,所以我们可以考虑将状态抽象出来。 状态的抽象一般有两种形式:接口和抽象类。如果所有的状态都有共同的数据域,可以使用抽象类,但如果只是单纯的执行动作,就可以使用接口。 这里我们就用接口。 public interface DispenserState { void press(); } 然后我们再定义满桶和空桶两个状态: public class

策略模式 -- 大话设计模式

牧云@^-^@ 提交于 2019-12-22 08:20:54
在今天,读书有时是件“麻烦”事。它需要你付出时间,付出精力,还要付出一份心境。--仅以《大话设计模式》来祭奠那逝去的…… 策略模式就是用来封装算法的。实践中,我们发现可以用它来封装几乎任何类型的规则,只要分析过程中听到需要在不同时间应用不同的业务规则,就可以考虑使用策略模式处理这种变化的可能性。 1.商场促销活动   实现商场促销活动,正常收费、满300返100和打8折活动   首先我们定义一个收费抽象类,包含一个收取现金抽象方法 /// <summary> /// 收费抽象类 /// </summary> public abstract class Fee { /// <summary> /// 收取现金抽象方法 /// </summary> public abstract double AcceptCash(double money); }   然后实现我们需要的算法:正常收费和打折收费,让其继承收费抽象类,重写AcceptCash方法实现不同的收费算法(如果我们以后要增加其他收费方法,只需要新增一个继承Fee收费抽象类的子类,实现其收费算法,而无需变动已经写好的算法) /// <summary> /// 正常收费 /// </summary> public class FeeNormal : Fee { public override double AcceptCash

什么是跨域

为君一笑 提交于 2019-12-21 18:56:22
1.同源策略 是浏览器的安全策略 协议名、域名、端口号必须一致 2.跨域 违背了同源策略就会产生跨域 3.解决跨域 jsonp cors 服务器代理模式 第一步 创建script标签 var script = docuemnt.createElement("script") 第二步 设置回调函数 fuction getData(data){ //数据请求回来会被触发的函数 consol.log(data) } 第三步 设置script标签的src属性 设置请求地址 script.src = "http://localhost:3000?callback=getData" 第四步 让script 标签生效 document.body.appendChild(script) 来源: 51CTO 作者: 喝醉的熊 链接: https://blog.51cto.com/13550695/2460639

使用策略模式减少if else

会有一股神秘感。 提交于 2019-12-21 04:09:04
首先要明确的说出策略模式会不可避免导致你的代码类变得很多,如果对应方法逻辑很复杂时可采用,如果逻辑不是很复杂就有点大材小用了。 package com.zihexin.application.strategy; /** * @Author: SimonHu * @Date: 2019/7/18 15:38 * @Description:定义策略模式 */ public interface Strategy { void consumeTask(); void refundTask(); void sqtConsumeTask(); void sqtRefundTask(); } package com.zihexin.application.strategy.strategyImpl; import com.zihexin.application.strategy.SpringUtils; import com.zihexin.application.strategy.Strategy; import com.zihexin.application.task.BaiDuWaiMaiTask; import org.springframework.beans.factory.annotation.Autowired; import org.springframework

Redis常见面试题解析(二)

你。 提交于 2019-12-21 03:21:59
文章目录 一、Redis 集群结构以及设计理念 1. Redis 集群架构模式有哪几种? 2. Redis 集群最大节点个数是多少? 3. Redis 集群的主从复制模型是怎样的? 4. 请介绍一下 Redis 集群实现方案 5. Redis 集群会有写操作丢失吗?为什么? 6. Redis 慢查询是什么?通过什么配置? 7. Redis 的慢查询修复经验有哪些?怎么修复的? 8. 如何优化 Redis 服务的性能? 9. Redis 的主从复制模式有什么优缺点? 10. Redis sentinel(哨兵)模式优缺点有哪些? 11. 如何设置 Redis 的最大连接数?查看 Redis 的最大连接数?查看 Redis 的当前连接数? 12. 介绍一些 Redis 常用的安全设置? 二、Redis 缓存管理与持久化机制 1. Redis 持久化机制有哪些? 2. Redis 持久化机制 AOF 和 RDB 有哪些不同之处? 3. 请介绍一下 RDB 持久化机制的优缺点 4. 请介绍一下 AOF 持久化机制的优缺点 5. 如果 AOF 文件的数据出现异常, Redis 服务怎么处理? 6. 常见的淘汰算法有哪些? 7. Redis 淘汰策略有哪些? 8. Redis 缓存失效策略有哪些? 9. Redis 如何做内存优化? 10. 什么是 bigkey? 有什么影响? 11.

设计模式(29) -- 策略模式

非 Y 不嫁゛ 提交于 2019-12-20 12:14:06
文章目录 需求 传统方案 策略模式 基本介绍 类图 策略模式解决鸭子问题 策略模式使用案例 1.JDK Arrays应用的源码分析 2.商城打折促销等不同优惠活动中常用 策略模式的注意事项和细节 需求 传统方案 策略模式 是一种行为型模式。 基本介绍 类图 策略模式解决鸭子问题 Duck FlyBehavior GoodFlyBehavior NoFlyBehavior BadFlyBehavior ToyDuck WildDuck QuackBehavior Client 运行结果: 策略模式使用案例 1.JDK Arrays应用的源码分析 2.商城打折促销等不同优惠活动中常用 代码略 策略模式的注意事项和细节 完 来源: CSDN 作者: 怒放de生命2010 链接: https://blog.csdn.net/baidu_21349635/article/details/103626798

设计模式之策略模式

送分小仙女□ 提交于 2019-12-19 23:52:24
策略模式的组成    —抽象策略角色: 策略类,通常由一个接口或者抽象类实现。   —具体策略角色:包装了相关的算法和行为。   —环境角色:持有一个策略类的引用,最终给 客户端 调用。 概念    策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)   Context(应用场景):   1、需要使用ConcreteStrategy提供的算法。   2、 内部维护一个Strategy的实例。   3、 负责动态设置运行时Strategy具体的实现算法。   4、负责跟Strategy之间的交互和数据传递。   Strategy(抽象策略类):   1、 定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,Context使用这个接口调用不同的算法,一般使用接口或抽象类实现。   ConcreteStrategy(具体策略类):   2、

设计模式(1)策略模式

╄→尐↘猪︶ㄣ 提交于 2019-12-19 22:44:14
先假设我们要做一个模拟鸭子的游戏,这群鸭子会在水里游泳、会嘎嘎的叫,那么运用OO的思想,先设计一个鸭子作为父类,然后所有的鸭子都继承这个父类。 现在,鸭子模拟游戏1.0版本就诞生了,这些鸭子继承了父类的游泳、嘎嘎叫,以及各自都有自己的描述。 接下来就是开发鸭子模拟游戏2.0了,现在需要给鸭子扩展一些模拟,例如飞行、还要给鸭子扩展一些种类,例如模型鸭、橡皮鸭。 这时候就可以继续扩展鸭子父类的属性,并且多添加几个子类。 由于模型鸭、橡皮鸭不会叫也不会飞,所以在子类中重载了quack()方法和fly()方法。 但是这个设计也是不合理的,因为每次有新的鸭子出现,就需要对quack()和fly()进行检查,判断这个类型的鸭子需不需要覆盖这两个方法,需要有一种更清晰的方法。 于是鸭子模拟游戏2.1版本就这样诞生了,这个时候将fly()和quack()从父类中提取出来,放入到两个接口中去,只有会飞、会嘎嘎叫的鸭子才会去继承这两个接口。 但是这样设计出来的结构,也是有缺陷的,例如Mallard和RedheadDuck它们的叫声都是“嘎嘎”,但是却写了重复的quack()代码,没有实现代码的复用。 我们需要重新考虑下这个鸭子模拟游戏整体的设计了,首先鸭子的fly()和quack()行为会频繁的根据鸭子的种类进行变化,基于设计原则——找出应用中可能需要变化之处,把它们独立出来

Vsftpd服务

徘徊边缘 提交于 2019-12-19 09:53:36
Vsftpd 服务 1. 匿名开放模式: 是一种最不安全的认证模式,任何人都可以无需密码验证而直接登录到 FTP 服务器。 搭建过程: yum install vsftpd* ftp -y iptables -F service iptables save mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf cat /etc/vsftpd/vsftpd.conf 默认配置: anonymous_enable=YES local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES xferlog_std_format=YES listen=NO listen_ipv6=YES pam_service_name=vsftpd userlist_enable=YES tcp_wrappers=YES 第 1 步:修改主配置文件: vim /etc/vsftpd/vsftpd.conf 添加下 5 行 : 注意空格,删除译文 :