二十二、策略模式

目录

      • 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/70737.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【高阶数据结构】AVL树详解

文章目录 前言1. AVL树的概念2. AVL树结构的定义3. 插入(仅仅是插入过程)4. 平衡因子的更新4.1 为什么要更新平衡因子?4.2 如何更新平衡因子?4.3 parent更新后,是否需要继续往上更新?4.4 平衡因子更新代码实…

6G 特点及表现

6G R&D Vision: Requirements and Candidate Technologies 5G已经提出来了大移动带宽,低时延和大规模机器互联,在这个基础上,6G加上了高可靠性,高定位精度和高智能化。 6G的主要候选技术,包括(子) THz 通信&#x…

微信小程序前后端开发快速入门(完结篇)

这篇是微信小程序前后端快速入门完结篇了,今天利用之前学习过的所有知识做一个新的项目「群登记助手v1.0」小程序。 整体技术架构:小程序原生前端小程序云开发。 经历了前面教程的学习,大家有了一定的基础,所以本次分享重心主要是…

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

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

《QT+PCL》点云的点选与框选

《QT+PCL》点云的点选与框选 效果展示关键代码对应Qt6与pcl1.13对应Qt6与pcl1.12对应Qt5与pcl1.12对应Qt5与pcl1.11资源效果展示 关键代码 对应Qt6与pcl1.13 点选 //点选--------------回调函数 void MainWindow::pp_callback_PointsSelect(const

⛳ Java 反射

目录 ⛳ Java 反射🎨 一、反射概述**🎃 使用反射的前提条件: **🎲 类正常加载过程如下图:反射优缺点:🧸 Java反射机制提供的功能: **🥅 反射主要API** 🏭 二、反射的使用&#x1f3a…

AUTOSAR NvM Block的三种类型

Native NVRAM block Native block是最基础的NvM Block,可以用来存储一个数据,可以配置长度、CRC等。 Redundant NVRAM block Redundant block就是在Native block的基础上再加一个冗余块,当Native block失效(读取失败或CRC校验失…

快速实现SAP的移动化和流程优化

热门议题: 1、企业如何快速解决人员移动办公的需求,比如在苹果安卓手机,平板电脑,MAC登录SAP。2、企业如何解决用户经常抱怨的流程复杂,操作繁琐,难以使用等问题 公司介绍: Synactive,Inc. 是…

leetcode 1171.从链表中删去总和值为零的连续节点

⭐️ 题目描述 🌟 leetcode链接:从链表中删去总和值为零的连续节点 思路: 在链表的 head 前新增加一个哨兵卫的头结点,方便计算前缀和。遍历链表,依次把每个节点的 val 相加到 sum 中去,再判断 sum 0 依…

C++笔记之unique_ptr转移堆内空间的所有权

C笔记之unique_ptr转移堆内空间的所有权 code review! 文章目录 C笔记之unique_ptr转移堆内空间的所有权一.C笔记之unique_ptr转移堆内空间的所有权方法1.使用std::move函数方法2.使用std::unique_ptr的reset方法方法3.返回unique_ptr方法4.std::unique_ptr的swap方法 二.uniq…

华为云MetaStudio多模态数字人进展及挑战介绍

// 编者按:数字人作为AI能力集大成者,涉及计算机视觉、计算机图形学、语音处理、自然语言处理等技术,正在金融、政务、传媒、电商等领域应用越来越广。LiveVideoStackCon 2023 上海站邀请到华为云的李明磊为我们介绍华为云在数字人领域当前…

每天一道leetcode:1192. 查找集群内的关键连接(图论困难tarjan算法)

今日份题目: 力扣数据中心有 n 台服务器,分别按从 0 到 n-1 的方式进行了编号。它们之间以 服务器到服务器 的形式相互连接组成了一个内部集群,连接是无向的。用 connections 表示集群网络,connections[i] [a, b] 表示服务器 a …