设计模式之策略模式
一.基本内容
1 . 实例
有各种鸭子(野鸭,北京鸭子,水鸭等,鸭子有各种行为,比如飞,叫等
显示鸭子的信息
传统方法解决:鸭子为抽象类,具体鸭子继承抽象类
2.传统方法的不足:
其他鸭子都继承了抽象类,所以fly让所有子类都会飞,这不正确
上面的问题,其实是继承带来的问题,对类的局部改动,尤其超类的局部改动,会影响其他部分,会有溢出效应
为了改进问题,可以通覆盖fly方法解决 ---- > 覆盖解决
如果我们有一个玩具鸭子,这样需要玩具鸭子覆盖所有的实现方法,麻烦 解决方法 -----> 策略模式
3 . Strategy Pattern ,也叫政策模式,定义算法族(策略族),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
4 . 体现了几个设计原则:
把变化的代码从不变的代码中分离出来
针对接口编程而不是具体类(定义了策略接口)
多用组合/聚合,少用继承(通过组合方式使用策略)
4.采用了面向对象的继承和多态机制
5.优点:
算法可以自由切换,实现抽象策略,就成为策略家族的一个成员,通过封装角色对其进行封装,保证对外提供“可自由切换”的策略;
避免使用多重的条件判断,使用策略,简化操作,避免了条件语句判断;
扩展性好
6.缺点
策略类数据增多
所有的策略类对外暴露
7.注意事项
策略模式的关键是:分析变化与不变的部分
核心思想是:多元组合/聚合,少用继承,用行为类组合,而不是行为的继承
体现了“对修改关闭,对扩展开放”的原则,客户端增加行为不要修改源代码,只要添加一种策略即可,避免了使用多重转移语句
提供了可以替换继承关系的方法,将算法封装在独立的Strategy类中似的可以独立于Context改变他,易于切换,理解,扩展
每添加一个策略就就增加一个类,当策略过多时就会导致类的数目庞大
如果系统中的一个策略家族的具体策略数量超过4个。则需要考虑使用混合模式,解决策略类膨胀和对外暴露的问题;
8.代码实现
public interface Fly {
void fly();//子类具体实现
}
public class GoodFly implements Fly{@Override
public void fly() {System.out.println("飞翔技术非常好");
}}
public class BadFly implements Fly{
@Override
public void fly() {System.out.println("飞翔技术一般");
}}
public class NoFly implements Fly{
@Override
public void fly() {System.out.println("不会飞");
}}
public abstract class Duck {
//属性,策略接口
Fly fly;public Duck() {}public abstract void display();public void quack() {System.out.println("鸭子嘎嘎叫。。");
}
public void swim() {System.out.println("鸭子游泳");
}
public void fly() {//改进if(fly!=null) {fly.fly();}
}
}
public class PekingDuck extends Duck{
public PekingDuck() {fly = new NoFly();
}@Override
public void display() {// TODO Auto-generated method stubSystem.out.println("北京鸭子");
}}
public class ToyDuck extends Duck{
public ToyDuck() {fly = new NoFly();
}
@Override
public void display() {System.out.println("玩具鸭子");}
//重写父类的所有方法
public void quack() {System.out.println("玩具鸭子不能叫。。");
}
public void swim() {System.out.println("玩具鸭子不能游泳");
}
public void fly() {System.out.println("玩具鸭子不能飞");
}
}
public class Client {
public static void main(String[] args) {WildDuck wduck = new WildDuck();wduck.fly();PekingDuck pduck = new PekingDuck();pduck.fly();
}
}
9.应用
Arrays使用了策略模式
Arrays的Comparator就使用了策略模式
多个类只区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为。
需要在不同情况下使用不同的策略(算法),或者策略还可能在未来用其它方式来实现。
对客户隐藏具体策略(算法)的实现细节,彼此完全独立。
相关文章:
设计模式之策略模式
一.基本内容1 . 实例有各种鸭子(野鸭,北京鸭子,水鸭等,鸭子有各种行为,比如飞,叫等显示鸭子的信息传统方法解决:鸭子为抽象类,具体鸭子继承抽象类2.传统方法的不足:其他鸭…...
dbdeployer 使用札记
https://github.com/datacharmer/dbdeployer默认配置文件为当前用户的$HOME/.dbdeployer/config.json作为配置文件,可以通过dbdeplyoer defaults export导出并修改配置或者直接通过dbdeployer defaults update来更新默认文件,配置文件包含MySQL初始信息。…...
MATLAB算法实战应用案例精讲-【图像处理】数字图像模糊化(附Java、python和matlab代码实现)
目录 前言 几个相关概念 噪声 滤波器 算法原理 算法思想 噪...
搭建Hexo博客-第1章-Git和GitHub以及Coding的简单用法
搭建Hexo博客-第1章-Git和GitHub以及Coding的简单用法 搭建Hexo博客-第1章-Git和GitHub以及Coding的简单用法 Coding GitHub Hexo Markdown 搭建博客 大家好,这是我第一次写博客。使用 GitHub Hexo 创建最基本的博客很容易,网上有很多现成的教程。…...
【C++修行之路】C/C++内存管理
文章目录程序区域内存划分C语言动态内存分配:new和delete:new、delete和malloc、free的区别:程序区域内存划分 C/C程序内存区域划分非常相似。 C语言动态内存分配: malloc、calloc、realloc都是C语言动态开辟内存的常用函数 其中 malloc 开…...
spring cloud alibaba Sentinel(四)
服务雪崩 在分布式系统中,由于网络原因或自身的原因,服务一般无法保证 100% 可用。 如果一个服务出现了问题,调用这个服务就会出现线程阻塞的情况, 此时若有大量的请求涌入,就会出现多条 线程阻塞等待,进而导致服务瘫痪。 由于服…...
Redis第三讲
目录 三、Redis03 3.1 Redis持久化之RDB 3.1.1 什么是RDB 3.1.2 备份是如何执行的 3.1.3 Fork 3.1.4 RDB持久化流程 3.1.5 dump.rdb文件 3.1.6 配置rdb文件生成位置 3.1.7 如何触发RDB快照以及保持策略 3.2 Redis持久化之AOF 3.2.1 什么是AOF 3.2.2 AOF持久化流程 …...
JAVA线程池的使用
一、池化思想和JAVA线程池 池化是很重要的思想;池化的好处是提供缓冲和统一的管理。这个笔者在本人的数据库连接池的博客中已经提到过了(JAVA常用数据库连接池_王者之路001的博客-CSDN博客 )。 线程池是另一种池化思想的运用,把…...
力扣56.合并区间
文章目录力扣56.合并区间题目描述排序合并力扣56.合并区间 题目描述 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中…...
代码随想录二刷Day03链表: 24.两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题 02.07. 链表相交,142.环形链表||
24.两两交换链表中的节点 文章链接:代码随想录 (programmercarl.com) 思路: (1)首先如果要处理相邻两个节点的话,一定需要操作两个节点的前一个节点才可以,因此,本题需要设定一个虚拟头节点 …...
我应该在我的博客上写什么? 介绍如何撰写初学者容易担心的文章
我想有很多人开了博客,但想不起来写作,无法取得进展。 博客的主题和文章的内容不会仅仅通过写你想做的事情来工作。 重要的是要了解用户想要阅读的内容以及人们可能收集的内容,并将其与您想要编写的内容很好地匹配。 这一次,我…...
嵌入式C语言设计模式 --- 外观模式
1 - 什么是外观模式? 外观模式(Facade Pattern),是一种比较简单的结构型模式,它存在的目的,也是为了简单。 外观模式隐藏了一系列接口的复杂性,旨在为外部客户端提供一个更高层次且统一简单的接口,简化了客户端调用某些模块的一系列操作。 外观模式应该是软件工程师…...
若依ruoyi——手把手教你制作自己的管理系统【三、代码生成】
昨天情人节一( ̄︶ ̄*)) 送给赛利亚一((* ̄3 ̄)╭ ********* 专栏略长 爆肝万字 细节狂魔 请准备好一键三连 ********* 修改后的页面: 干干净净贼舒服一Ψ( ̄∀ ̄)Ψ——Ψ( ̄∀&#x…...
SCI论文写作神器集合 —— 超级实用
特此声明: 本文拷贝多处别人的内容,并给出具体的链接 本文所提到的软件都为博主在文章撰写过程中发掘的比较实用的工具,旨在帮助小伙伴们更快更有效率的完成文章发表,如果其他好用的工具,欢迎各位交流~~ 一、文献搜索神…...
MAC 系统安装多版本 JDK 并任意切换
1、背景 在进行 Java 开发的过程中,我们可能需要使用不同版本的 JDK。例如:一些旧的 Java 应用程序只能在旧版本的 JDK 上运行,而一些新的 Java 应用程序需要较新的 JDK 才能运行。 在 MAC 系统上,如何安装多个版本的 JDK 并配置…...
配置 Smart Link 接口时需注意的互斥命令
配置 Smart Link 接口时需注意的互斥命令 一、接口加入Smart Link组功能与以下功能互斥一、接口加入Smart Link组功能与以下功能互斥 注:当接口已经加入Smart Link组,则不能再配置以下功能;反之,当接口已经配置以下功能ÿ…...
QT的下载和安装
这里介绍的是QT官方方式下载,每次都让我很糊涂,就记载一下。先是下载QT online installerhttps://www.qt.io/download 在下方有Go Open Sourcehttps://www.qt.io/download-open-source 在下方有Download the Qt Online installerhttps://www.qt.io/downl…...
nacos配置中心与服务注册中心
文章目录 目录 文章目录 前言 一、服务注册与发现中心 二、配置中心 总结 前言 Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是 Spring Cloud Alibaba 组件之一,负责服务注册发现和服务配置. [服务治理的作用和微服务配置管理] Na…...
UE4 手把手教你做插件(1) 从代码引用插件
0,前言 我看的是 技术宅阿棍儿 的视频,B站有。 系列视频:从代码引用插件_哔哩哔哩_bilibili 看不懂,只能边查资料边看,讲的顺序有点乱 1,根据视频提示创建第三方插件 注意:如果只有空白插件的情…...
【Mybatis源码解析】一级缓存和二级缓存源码解析
文章目录缓存使用缓存源码测试代码上一篇《【Mybatis源码解析】mapper实例化及执行流程源码分析》,主要讲解了Mybatis的基本原理一级执行的流程,这一章来讲一下Mybatis的两个缓存:一级缓存和二级缓存。 因为网上大部分都是使用xml配置的方式…...
你知道MES实施的要点吗?
随着国家行动纲领:中国制造2025(智能制造)的发布,MES系统在制造业的工厂中所占比重越来越大,越来越多的工厂选择使用MES完成工厂的信息化、数字化、智能化生产。伴随着企业对MES的需求不断增大,生产MES的厂…...
告诉你为什么为什么 SELECT COUNT(*) FROM table 在 InnoDB 引擎中比 MyISAM引擎中的速度慢
统计一张表的总数量,是我们开发中常有的业务需求,通常情况下,我们都是使用 select count(*) from table SQL 语句来完成。随着业务数据的增加,你会发现这条语句执行的速度越来越慢,为什么它会变慢呢? 为什…...
Redis 命令和Redis key键
Redis 命令 Redis 命令用于在 Redis 服务器上执行一些操作,而命令运行的方式是通过客户端命令行来执行的,这种方式也被称为“命令行模式”。因此想要在 Redis 服务器上运行命令,您首先需要开启一个 Redis 客户端。操作方法如下: …...
如何入侵服务器
根据中华人民共和国刑法: 第二百八十六条违反国家规定,对计算机信息系统功能进行删除、修改、增加、干扰,造成计算机信息系统不能正常运行,后果严重的,处五年以下有期徒刑或者拘役;后果特别严重的ÿ…...
在Windows10上安装虚拟机---VMware 17 Pro下载与安装
在Windows10上安装虚拟机---VMware下载与安装0 前言1 下载VMware 17 pro2 安装VMware 17 Pro3. 打开Vmware0 前言 电脑原生系统:Windows10虚拟机软件:VMware 17 pro准备好安装虚拟机的文件夹路径 1 下载VMware 17 pro 下载网址:VMware 官网…...
生命周期函数、组件
1. 生命周期函数 beforeCreate : 无法通过 vm 访问data 中的数据、methods 中的方法created :可以访问 vm 中的 data 的数据, methods 中的方法beforeMount:为经 Vue 编译的 dommounted:经过 vue 编译的 dom &#x…...
蓝桥杯 stm32 PWM 测量频率
本文代码使用 HAL 库。 文章目录 前言一、PWM 原理图:二、CubeMX 创建工程:三、PWM 单路测频:四、详细代码:1. 获取 CNT函数。2. 设置CNT为 0 函数3. 开启TIM2_CH1的输入捕获中断函数4. TIM 回调函数5. 在 LCD 上显示 R40 和 R39 的频率。总结前言 一、PWM 原理图: 参考…...
Docker CPU 资源控制
01-本章背景知识 在生产环境里运行服务的一个主要问题是如何公平有效的进行资源分配。 1、Docker 容器使用核心操作系统的 Cgroups 管理容器的 CPU资源分配。 2、Docker 容器资源竞争时,默认使用简单均分(CFS)算法。 3、Docker 容器也可以根…...
小红书数据平台:笔记爆文率提升的三大秘诀公式!
导语 对于小红书商家 / 博主来说,写出爆文就像买彩票,根本不能预知哪一篇会爆。2023年,小红书哪些内容会脱颖而出呢?我们又该如何把握热点趋势,实现优质内容转化出爆文~ 美妆作为小红书的长红赛道,本文我…...
Spring MVC 之Tomcat启动流程
从web.xml说起在开始 Spring MVC 的分析之前,先来聊一聊 Java 初学者接触的最多的 Java Web 基础。还记得我的第一个 Web 工程是由 Servlet、Velocity 和 Filter 来完成的,那时几乎所有人都是根据 Servlet、JSP 和 Filter 来编写自己的第一个 Hello Worl…...
成都网站设计平台/本地建站软件有哪些
1、mongodb是什么?MongoDB 是由 C语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在给 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存…...
app开发功能价格表/网站排名优化服务
如果嵌套集具有开箱即用的更好的功能将是不错的.您发现的技巧是从平面集构建树:>以一组按lft排序的所有节点开始>第一个节点是根添加它,因为树的根移动到下一个节点>如果它是前一个节点的子节点(prev.lft和prev.rht之间的lft)将一个子节点添加到树中并向前…...
wordpress 便签/百度电话客服
“每个品牌商都希望产品快速地到达用户手中,能够形成一个产品体验和用户交互的过程。”奥克斯家电天猫渠道经理郭施露说,“但是一直以来,厂家受制于信息化建设水平,以及并不直接面对用户等原因,这一愿望很难实现”。 对…...
如何设计网络/邵阳seo优化
DNS服务配置及拓展一.DNS服务的信息说明:A ##正向记录PTR ##反向,ip到域名host -l example.com ##查看域中的所有主机dig -t soa example.com ##辅助dns软件包: bind DNS主配置目录:/var/named/chroot/DNS主配置文件:/etc/nam…...
网站优化文章怎么做/西安seo整站优化
1、CYGWIN 安装教程 http://wenku.baidu.com/link?urlk4L2-X9IyLnzvpICllMqurzUfQEyIXF_USkFU85gr9rtWfVV-sE8mHK8LQlIniE6ZbM2isZS_hTuJur-HINwZgSoPGvHCWoN0OWqwr7SMlahttp://www.33lc.com/article/7276.html安装后配置Path环境变量 如添加C:\cygwin64\…...
wordpress首页多图片/torrentkitty磁力搜索引擎
2019独角兽企业重金招聘Python工程师标准>>> 什么是backbone backbone不是脊椎骨,而是帮助开发重量级的javascript应用的框架。 主要提供了3个东西:1、models(模型) 2、collections(集合) 3、views(视图) backbone.js文件本身很小…...