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

二十二、策略模式

目录

      • 1、项目需求
      • 2、传统方案解决鸭子问题的分析和代码实现
      • 3、传统方式实现存在的问题分析和解决方案
      • 4、策略模式基本介绍
      • 5、使用策略模式解决鸭子问题
      • 6、策略模式的注意事项和细节
      • 7、策略模式的使用场景

以具体项目来演示为什么需要策略模式,策略模式的优点,以及策略模式使用过程中需要注意的问题

1、项目需求

  • 有各种有鸭子(野鸭、北京鸭子、烤鸭),鸭子有各种行为(飞、叫),但是各种鸭子的行为又不完全一样
  • 显示鸭子信息

2、传统方案解决鸭子问题的分析和代码实现

1)传统设计方案

设计一个抽象父类 duck , 定义各种行为,然后各种鸭子种类继承该父类,重新行为方法
在这里插入图片描述

2)代码实现

public abstract class Duck {public abstract void display();public void quack() {System.out.println("鸭子嘎嘎叫~~~");}public void swim() {System.out.println("鸭子会游泳~~~");}public void fly() {System.out.println("鸭子会飞翔~~~");}
}public class BjDuck extends Duck{@Overridepublic void display() {System.out.println("这是一直北京鸭子~~~~");}@Overridepublic void fly() {System.out.println("北京鸭子不能飞翔!!");}
}

3、传统方式实现存在的问题分析和解决方案

1)存在的问题
不同子类的行为是不一样的,所以每次定义一个子类就需要重写父类的行为,导致代码太耦合

2)解决方式
使用策略模式


4、策略模式基本介绍

策略模式:指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法

策略模式体现了几个原则:

  • 把变化的代码从不变的代码中抽离出来
  • 针对接口编程而不是类
  • 多采用组合,聚合,少用继承的模式

策略模式基本类图:
在这里插入图片描述

5、使用策略模式解决鸭子问题

  • 封装行为接口,实现算法族
  • 超类中放行为的接口对象,在子类中具体设定行为对象

1) 定义行为接口,行为接口的具体实现类

// 飞行行为
public interface FlyBehavior {void fly();
}public class NoflyBehavior implements FlyBehavior{@Overridepublic void fly() {System.out.println("不会飞");}
}public class GoodflyBehavior implements FlyBehavior{@Overridepublic void fly() {System.out.println("具备很好的飞行技能!!");}
}// 叫行为
public interface QuackBehavior {void quack();
}
public class NoQuackBehavior implements QuackBehavior {@Overridepublic void quack() {System.out.println("不能叫");}
}
public class GeGeQuackBehavior implements QuackBehavior{@Overridepublic void quack() {System.out.println("咯咯叫");}
}

2)超类中聚合行为接口

public abstract class Duck {FlyBehavior flyBehavior;QuackBehavior quackBehavior;public abstract void display();public void fly() {flyBehavior.fly();}public void quack() {quackBehavior.quack();}
}

3)实现类中设置具体的行为对象

public class BjDuck extends Duck{public BjDuck() {this.flyBehavior = new BadflyBehavior();this.quackBehavior = new GeGeQuackBehavior();}@Overridepublic void display() {System.out.println("我叫做北京鸭子!!");}}

4)测试

public class Test {public static void main(String[] args) {BjDuck bjDuck = new BjDuck();bjDuck.display();bjDuck.fly();bjDuck.quack();}
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8JQqGxr0-1691938691359)(E:\学习笔记\设计模式\设计模式.assets\image-20230813092118844.png)]


6、策略模式的注意事项和细节

  • 策略模式的关键是:分析项目中的变化和不变部分
  • 核心思想:多使用组合,少使用继承;用行为类进行组合,而不是行为的继承

需要注意的是:每添加一个策略就要增加一个类,当策略过多时会导致类数目庞大!!!

7、策略模式的使用场景

https://blog.csdn.net/m4330187/article/details/121292879

相关文章:

二十二、策略模式

目录 1、项目需求2、传统方案解决鸭子问题的分析和代码实现3、传统方式实现存在的问题分析和解决方案4、策略模式基本介绍5、使用策略模式解决鸭子问题6、策略模式的注意事项和细节7、策略模式的使用场景 以具体项目来演示为什么需要策略模式,策略模式的优点&#x…...

[K8s]问题描述:k8s拉起来的容器少了cuda的so文件

问题解决:需要设置Runtimes:nvidia的同时设置Default Runtimenvidia...

Postman如何做接口测试:什么?postman 还可以做压力测试?

我们都知道, postman 是一款很好用的接口测试工具。不过 postman 还可以做简单的压力测试,而且步骤只需要 2 步。 首先,打开 postman, 编写接口的请求参数。 然后,点击右下方的 runner 运行器,把需要测试的接口拖动到…...

MySQL 自增 ID 默认从 1 开始,如何设置自增 ID 从 0 开始

MySQL 是一种关系型数据库,它是世界上最流行的关系型数据库之一。在 MySQL 中,自增是一种非常有用的功能,它可以自动给主键赋值,并保证每个主键是唯一的。然而,许多人不知道的是,MySQL 默认情况下从 1 开始…...

WebRTC音视频通话-实现iOS端调用ossrs视频通话服务

WebRTC音视频通话-实现iOS端调用ossrs视频通话服务 之前搭建ossrs服务,可以查看:https://blog.csdn.net/gloryFlow/article/details/132257196 这里iOS端使用GoogleWebRTC联调ossrs实现视频通话功能。 一、iOS端调用ossrs视频通话效果图 iOS端端效果图…...

uniapp的UI框架组件库——uView

在写uniapp项目时候,官方所推荐的样式库并不能满足日常的需求,也不可能自己去写相应的样式,费时又费力,所以我们一般会去使用第三方的组件库UI,就像vue里我们所熟悉的elementUI组件库一样的道理,在uniapp中…...

由于找不到msvcp140.dll无法继续执行代码是什么原因

使用计算机过程中,有时会遇到一些错误提示,其中之一就是关于msvcp140.dll文件丢失或损坏的错误。msvcp140.dll是Windows系统中非常重要的文件,是Microsoft Visual C Redistributable中动态链接库的文件,如果缺失或损坏&#xff0c…...

kafka生产者幂等与事务

目录 前言: 幂等 事务 总结: 参考资料 前言: Kafka 消息交付可靠性保障以及精确处理一次语义的实现。 所谓的消息交付可靠性保障,是指 Kafka 对 Producer 和 Consumer 要处理的消息提供什么样的承诺。常见的承诺有以下三…...

Docker容器:docker基础概述、安装、网络及资源控制

文章目录 一.docker容器概述1.什么是容器2. docker与虚拟机的区别2.1 docker虚拟化产品有哪些及其对比2.2 Docker与虚拟机的区别 3.Docker容器的使用场景4.Docker容器的优点5.Docker 的底层运行原理6.namespace的六项隔离7.Docker核心概念 二.Docker安装 及管理1.安装 Docker1.…...

实验篇——亚细胞定位

实验篇——亚细胞定位 文章目录 前言一、亚细胞定位的在线网站1. UniProt2. WoLFPSORT3. BUSCA4. TargetP-2.0 二、代码实现1. 基于UniProt(不会)2. 基于WoLFPSORT后续(已完善,有关代码放置于[python爬虫学习(一&#…...

【日常积累】HTTP和HTTPS的区别

背景 在运维面试中,经常会遇到面试官提问http和https的区别,今天咱们先来简单了解一下。 超文本传输协议HTTP被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果…...

Qt creator之对齐参考线——新增可视化缩进功能

Qt creator随着官方越来越重视,更新频率也在不断加快,今天无意中发现qt creator新版有了对齐参考线,也称可视化缩进Visualize Indent,默认为启用状态。 下图为旧版Qt Creator显示设置栏: 下图为新版本Qt Creator显示设…...

Go语言之依赖管理

go module go module是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具。 GO111MODULE 要启用go module支持首先要设置环境变量GO111MODULE 通过它可以开启或关闭模块支持,它有三个可选…...

【定时任务处理中的分页问题】

最近要做一个定时任务处理的需求,在分页处理上。发现了大家容易遇到的一些"坑",特此分析记录一下。 场景 现在想象一下这个场景,你有一个定时处理任务,需要查询数据库任务表中的所有待处理任务,然后进行处理…...

Vue3 Vuex状态管理多组件传递数据简单应用

去官网学习→安装 | Vuex cd 项目 安装 Vuex&#xff1a; npm install --save vuex 或着 创建项目时勾选Vuex vue create vue-demo ? Please pick a preset: Manually select features ? Check the features needed for your project: (Press <space> to se…...

Beats:安装及配置 Metricbeat (一)- 8.x

在我之前的文章&#xff1a; Beats&#xff1a;Beats 入门教程 &#xff08;一&#xff09;Beats&#xff1a;Beats 入门教程 &#xff08;二&#xff09; 我详细描述了如何在 Elastic Stack 7.x 安装及配置 Beats。在那里的安装&#xff0c;它通常不带有安全及 Elasticsearc…...

openCV使用c#操作摄像头

效果如下&#xff1a; 1.创建一个winform的窗体项目&#xff08;框架.NET Framework 4.7.2&#xff09; 2.Nuget引入opencv的c#程序包&#xff08;版本最好和我一致&#xff09; 3.后台代码 using System; using System.Collections.Generic; using System.ComponentModel;…...

Centos 防火墙命令

查看防火墙状态 systemctl status firewalld.service 或者 firewall-cmd --state 开启防火墙 单次开启防火墙 systemctl start firewalld.service 开机自启动防火墙 systemctl enable firewalld.service 重启防火墙 systemctl restart firewalld.service 防火墙设置开…...

【第二讲---初识SLAM】

SLAM简介 视觉SLAM&#xff0c;主要指的是利用相机完成建图和定位问题。如果传感器是激光&#xff0c;那么就称为激光SLAM。 定位&#xff08;明白自身状态&#xff08;即位置&#xff09;&#xff09;建图&#xff08;了解外在环境&#xff09;。 视觉SLAM中使用的相机与常见…...

C++ 面向对象三大特性——继承

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;C 继承 ☂️<3>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<4>前言&#xff1a;面向对象三大特性的&#xff0c;封装&#xff0c;继承&#xff0c;多态&#xff…...

Lattice Diamond 3.11安装到实战:一个FPGA小白的避坑血泪史(附完整问题清单)

Lattice Diamond 3.11安装到实战&#xff1a;一个FPGA小白的避坑血泪史&#xff08;附完整问题清单&#xff09; 如果你正准备踏入Lattice FPGA的世界&#xff0c;手里攥着Diamond 3.11安装包&#xff0c;既兴奋又忐忑——这篇文章就是为你准备的。作为过来人&#xff0c;我深知…...

ib_insync部署指南:生产环境下的稳定性和可靠性保障

ib_insync部署指南&#xff1a;生产环境下的稳定性和可靠性保障 【免费下载链接】ib_insync Python sync/async framework for Interactive Brokers API 项目地址: https://gitcode.com/gh_mirrors/ib/ib_insync 在金融交易系统的开发中&#xff0c;稳定可靠的API连接是…...

wan2.1-vae镜像特性解析:服务器重启自动恢复服务机制说明

wan2.1-vae镜像特性解析&#xff1a;服务器重启自动恢复服务机制说明 1. 平台核心能力概述 muse/wan2.1-vae是基于Qwen-Image-2512模型的AI图像生成平台&#xff0c;其核心优势在于&#xff1a; 双语言支持&#xff1a;同时兼容中英文提示词输入超高分辨率&#xff1a;最高支…...

解决Windows内存不足困扰:Mem Reduct内存管理实战指南

解决Windows内存不足困扰&#xff1a;Mem Reduct内存管理实战指南 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct 您…...

Chrome DevTools MCP:让 AI 编码助手拥有“浏览器之眼“

1.1 背景&#xff1a;AI 编程的"盲区" 在 AI 辅助编程的时代&#xff0c;我们已经习惯了让 AI 帮我们生成代码、修复 Bug、甚至重构项目。但长期以来&#xff0c;AI 编码助手有一个根本性的局限——它们只能"写"代码&#xff0c;却看不到代码在浏览器中实…...

青少年软件编程等级考试C/C++ 1~8级历年真题解析与备考指南

1. 青少年软件编程等级考试概述 对于很多刚开始学习编程的青少年来说&#xff0c;青少年软件编程等级考试是一个检验学习成果的好机会。这个考试分为1~8级&#xff0c;从最基础的C/C语法到复杂的算法和数据结构&#xff0c;循序渐进地考察学生的编程能力。我当年第一次参加这个…...

腾讯地图SDK隐私协议合规接入实战:你的App真的合法显示地图了吗?

腾讯地图SDK隐私合规实战&#xff1a;从法律条文到代码落地的全流程指南 当你的App因为地图功能被应用商店拒审时&#xff0c;当用户投诉你的应用"偷偷收集位置信息"时&#xff0c;当合规团队发来长达20页的整改清单时——这些场景正在成为移动开发者的日常。去年某社…...

嵌入式WiFi开发 | 基于wireless_tools的交叉编译实战与移植指南

1. 嵌入式WiFi开发入门&#xff1a;为什么需要wireless_tools&#xff1f; 在嵌入式Linux开发中&#xff0c;网络连接能力往往是刚需。想象一下你的智能家居设备需要自动连接路由器&#xff0c;或者工业传感器需要通过WiFi上传数据——这些都离不开可靠的无线网络配置工具。这就…...

5步构建适合你的Yuzu版本管理系统:写给模拟器玩家的效率指南

5步构建适合你的Yuzu版本管理系统&#xff1a;写给模拟器玩家的效率指南 【免费下载链接】yuzu-downloads 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu-downloads 还在为Yuzu模拟器版本选择而困惑&#xff1f;为什么新游戏在最新版模拟器上反而卡顿&#x…...

嵌入式开发必备:rootfs.img镜像修改的5个常见问题与解决方案

嵌入式开发实战&#xff1a;rootfs.img镜像修改的五大核心问题与深度解决方案 在嵌入式Linux开发中&#xff0c;rootfs.img镜像的修改是每个开发者绕不开的关键环节。无论是添加自定义配置文件、更新系统组件&#xff0c;还是优化启动流程&#xff0c;对根文件系统的调整都直接…...