设计模式简单示例

1. 设计模式

2. 设计模式分类

2.1. 命令模式

命令模式(Command Pattern)是一种行为型设计模式,又叫动作模式或事务模式。它将请求(命令)封装成对象,使得可以用不同的请求对客户端进行参数化,具体的请求可以在运行时更改、排队或记录,它讲发出者和接收者解耦 (顺序:发出者–>命令–>接收者)

本质:封装请求

  1. 应用场景
    餐厅点餐:在一家餐厅中,服务员充当调用者,厨师充当接收者,菜品可以作为具体命令。当顾客想点菜时,服务员会将顾客的需求封装成一个命令对象,并传递给厨师。厨师根据命令对象中的信息来完成相应的烹饪工作。这样,顾客和厨师之间不需要直接沟通,而是通过命令对象来实现点餐和烹饪的解耦。

  2. 点餐场景实现

  • (1) 抽象命令(Command)- Command
public interface Command {//点菜void order();//取消点菜void cancelOrder();
}
  • (2) 接收者(Receiver)- Chef
public class Chef {public void cook() {System.out.println("厨师执行点菜命令:正在烹饪菜品...");}public void cancelCooking() {System.out.println("厨师执行取消命令:停止烹饪菜品!");}
}
  • (3) 具体命令(Concrete Command)- OrderCommand
public class OrderCommand implements Command{// 厨师private Chef chef;public OrderCommand(Chef chef) {this.chef = chef;}public void order() {//与具体的烹饪者(厨师)关联,执行点菜操作chef.cook();}public void cancelOrder() {//与具体的烹饪者(厨师)关联,执行取消点菜操作chef.cancelCooking();}
}
  • (4) 调用者(invoker)- Waitor

public class Waiter {//命令对象private Command command;public void setCommand(Command command) {this.command = command;}public void takeOrder() {// 服务员接收到顾客的点菜请求System.out.println("服务员接收到顾客(客户端)点菜请求!");// 执行点菜操作command.order();}public void cancelOrder() {// 服务员收到顾客的取消点菜请求System.out.println("服务员接收到顾客(客户端)取消点菜请求!");// 执行取消点菜操作command.cancelOrder();}
}

2.1. 策略模式

策略模式:策略模式是一种行为型模式,它将对象和行为分开,将行为定义为 一个行为接口 和 具体行为的实现。策略模式最大的特点是行为的变化,行为之间可以相互替换。每个if判断都可以理解为就是一个策略。本模式使得算法可独立于使用它的用户而变化。

  1. 策略模式包含如下角色:
  • Strategy: 抽象策略类:策略是一个接口,该接口定义若干个算法标识,即定义了若干个抽象方法(如下图的algorithm())

  • Context: 环境类 /上下文类:上下文是依赖于接口的类(是面向策略设计的类,如下图Context类),即上下文包含用策略(接口)声明的变量(如下图的strategy成员变量)。上下文提供一个方法(如下图Context类中的的lookAlgorithm()方法),持有一个策略类的引用,最终给客户端调用。该方法委托策略变量调用具体策略所实现的策略接口中的方法(实现接口的类重写策略(接口)中的方法,来完成具体功能)

  • ConcreteStrategy: 具体策略类:具体策略是实现策略接口的类(如下图的ConcreteStrategyA类和ConcreteStrategyB类)。具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体方法。(说白了就是重写策略类的方法!)作。这样,顾客和厨师之间不需要直接沟通,而是通过命令对象来实现点餐和烹饪的解耦。

  1. 应用场景
    假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这要复杂。比如,本网站可能对所有的高级会员提供每本20%的促销折扣:对中级会员提供每本10%的促销折扣;对初级会员没有折扣。

    • 根据描述,折扣是根据以下的几个算法中的一个进行的:
    • 算法一:对初级会员没有折扣。
    • 算法二:对中级会员提供10%的促销折扣。
    • 算法三:对高级会员提供20%的促销折扣。
      给出一本图书,如300元,若是高级会员,则输出价格为240元。
  2. 场景实现

  • (1) 抽象类策略(Strategy)
public interface MemberStrategy {// 一个计算价格的抽象方法//price商品的价格 n商品的个数public double calcPrice(double price, int n);
}
  • (2) 具体实现类(Concrete Strategy)
// 普通会员——不打折
public class PrimaryMemberStrategy implements MemberStrategy { // 实现策略//重写策略方法具体实现功能@Overridepublic double calcPrice(double price, int n) {return price * n;}
}
// 普通会员——不打折
// 中级会员 打百分之10的折扣
public class IntermediateMemberStrategy implements MemberStrategy{@Overridepublic double calcPrice(double price, int n) {double money = (price * n) - price * n * 0.1;return money;}
}
// 普通会员——不打折
// 高级会员类 20%折扣
public class AdvanceMemberStrategy implements MemberStrategy{@Overridepublic double calcPrice(double price, int n) {double money = price * n - price * n * 0.2;return money;}
}
  • (3) 上下文累(Context )
/*** 负责和具体的策略类交互* 这样的话,具体的算法和直接的客户端调用分离了,使得算法可以独立于客户端独立的变化。*/// 上下文类/环境类
public class MemberContext {// 用户折扣策略接口private MemberStrategy memberStrategy;// 注入构造方法public MemberContext(MemberStrategy memberStrategy) {this.memberStrategy = memberStrategy;}// 计算价格public double qoutePrice(double goodsPrice, int n){// 通过接口变量调用对应的具体策略return memberStrategy.calcPrice(goodsPrice, n);}}

2.3. 工厂模式 (Factory)

工厂模式:工厂模式属于创建型设计模式,它用于解耦对象的创建和使用。通常情况下,我们创建对象时需要使用new操作符,但是使用new操作符创建对象会使代码具有耦合性。工厂模式通过提供一个公共的接口,使得我们可以在不暴露对象创建逻辑的情况下创建对象。

  • 工厂模式分为三种类型:
    • 简单工厂
    • 方法工厂
    • 抽象工厂

本质: 对获取对象过程的抽象。\

  1. 工厂模式包含如下角色:
  • Factory(工厂角色)工厂角色即工厂类,它是简单工厂模式的核心,负责实现创建所有实例的内部逻辑;工厂类可以直接被外界直接调用,创建所需的产品对象;在工厂类中提供了静态的工厂方法factoryMethod(),它返回一个抽象产品类Product,所有的具体产品都是抽象产品的子类。
  • Product(抽象产品角色)抽象产品角色是简单工厂模式所创建的所有对象的父类,负责描述所有实例所共有的公共接口,它的引入将提高系统的灵活性,使得在工厂类中只需定义一个工厂方法,因为所有创建的具体产品对象都是其子类对象。
  • ConcreteProduct(具体产品类)具体产品角色是简单工厂模式的创建目标,所有创建的对象都充当这个角色的某个具体类的实例。每一个具体产品角色都继承了抽象产品角色,需要实现定义在抽象产品中的抽象方法 。
  1. 应用场景
    假设现在要设计一个贩卖各类书籍的电子商务网站的购物车系统。一个最简单的情况就是把所有货品的单价乘上数量,但是实际情况肯定比这要复杂。比如,本网站可能对所有的高级会员提供每本20%的促销折扣:对中级会员提供每本10%的促销折扣;对初级会员没有折扣。

    • 根据描述,折扣是根据以下的几个算法中的一个进行的:
    • 算法一:对初级会员没有折扣。
    • 算法二:对中级会员提供10%的促销折扣。
    • 算法三:对高级会员提供20%的促销折扣。
      给出一本图书,如300元,若是高级会员,则输出价格为240元。
  2. 场景实现

  • (1) 抽象产品类(Strategy)

/*** @author Evan Walker* @version 1.0* @desc 昂焱数据: https://www.ayshuju.com* @date 2023/04/04 13:41:41*/
public interface Fruit {String getColor();
}`
  • (2) 实际产品类(Concrete Strategy)
/*** @author Evan Walker* @version 1.0* @desc 昂焱数据: https://www.ayshuju.com* @date 2023/04/04 13:41:41*/
public class Apple implements Fruit{@Overridepublic String getColor() {return "红色";}
}
public class Orange implements Fruit{@Overridepublic String getColor() {return "橙色";}
}
public class Pear implements Fruit{@Overridepublic String getColor() {return "黄色";}
}
  • (3) 工厂角色( Factory )
/*** @author Evan Walker* @version 1.0* @desc 昂焱数据: https://www.ayshuju.com* @date 2023/04/04 13:44:44*/
public class FruitFactory {public Fruit createFruit(String fruitType) {if(fruitType.equalsIgnoreCase("Apple")){return new Apple();} else if(fruitType.equalsIgnoreCase("Orange")) {return new Orange();}else if(fruitType.equalsIgnoreCase("Pear")){return new Pear();}return null;}
}

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

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

相关文章

工控软件开发框架,GTK和QT好难选,快来拯救开发者。

工控软件开发框架如何选,有人喜欢GTK,有人钟意QT,而且每个人都有自己的一番道理,好像说的还都有理,这种情况该怎么办呢?大千UI工场带着你深入了解下。 一、GTK是什么 GTK(GIMP Toolkit)是一个…

【JavaWeb】利用IntelliJ IDEA 2024.1.4 +Tomcat10 搭建Java Web项目开发环境(图文超详细)

1、启动IntelliJ idea 2024.1.4 在欢迎页面,请确认好版本。因为不同的版本,搭建项目过程不太一样。 点击,新建项目。如图: 2、新建项目 在新建项目界面,选择java,在右侧信息模块内,根据个人情…

帮公司搭了个Nuxt3项目框架

theme: smartblue 最近公司立项了一个新项目,因为是to C 的,所以对SEO是有较高需求的,由于公司前端技术栈统一用的VUE,顺理成章的就选择了nuxt这个全栈框架。项目立项之后我就被安排了负责前端项目框架的搭建,从搭建过…

高校教师教学质量评估系统-计算机毕业设计源码03344

摘要 在高等教育中,教学质量是培养优秀人才的关键。为了提高教学质量,高校需要建立一套科学、有效的教师教学质量评估系统。本研究采用 SSM技术框架,旨在开发一款高校教师教学质量评估系统。 SSM框架作为一种成熟的Java开发框架,具…

网安小贴士(6)TCP/IP分层

一、前言 1983年,美国国防部决定将TCP/IP作为所有计算机网络的标准协议,这标志着TCP/IP正式成为互联网的基础协议。随着个人计算机的普及和网络技术的发展,TCP/IP模型被广泛应用于各种网络环境中,包括局域网(LAN&#…

【图说中国】大江大河你知道哪些?

【图说中国】大江大河你知道哪些? 中国河流 中国是世界上河流最多国家之一,其中流域面积超过1000平方米河流就有1500多条。 主要有长江、黄河、黑龙江、珠江、淮河、海河、辽河、雅鲁藏布江、塔里木河、澜沧江、怒江、闽江、钱塘江、韩江、鸭绿江、图…

Pandas函数详解:案例解析(第25天)

系列文章目录 Pandas函数详解排序函数聚合函数缺失值处理日期函数 文章目录 系列文章目录前言1 索引和列名操作1.1 查看索引和列名1.2 修改索引和列名 2 常用计算函数2.1 排序函数2.2 聚合函数2.3 练习 3 缺失值处理3.1 缺失值概念3.2 加载包含缺失值数据3.3 查看缺失值3.4 缺失…

十五、【源码】给代理对象设置属性

源码地址:https://github.com/spring-projects/spring-framework 仓库地址:https://gitcode.net/qq_42665745/spring/-/tree/15-proxy-set-property 给代理对象设置属性 之前的代码是创建Bean进行判断,要不要进行代理,如果代理…

物联网应用Fast ingest

一、原文路径 Tuning the System Global Area 二、翻译 1、原理 Fast ingest 优化是针对高并发,单行数据的插入这种场景的。比如IOT应用采集(很符合国网的用采数据场景)。 Fast ingest 使用MEMOPTIMIZE_WRITE 提示来插入数据到 MEMOPTIM…

LVM负载均衡群集

一.群集基础概述 1.群集的类型 (1)负载均衡的群集:以提高应用系统的响应能力,尽可能处理更多的访问请求,减少延迟为目标,获得高并发的、高负载的整体性能。例如:“DNS轮询”,“应用…

.net 快速开发框架开源

DF.OpenAPI开源系统 前后端分离,开箱即用,java经典功能.net也具备 系统介绍 DF.OpenAPI是基于Admin.NET二开的,是一个开源的多租户后台管理系统。采用前后端分离技术(前端使用vue.js,后端使用.net 3~.net6&#xff…

SyntaxError: invalid character in identifier 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

鸿翼全链智能知识管理,打造大模型时代的企业知识管理新范式

在知识经济的浪潮中,知识已成为企业构筑竞争优势的基石。随着大模型转向应用落地,其强大的语义理解、推理、逻辑、记忆等能力,推动企业知识管理迈向一个“智能涌现”的新时代。 鸿翼大模型KM知识管理系统,植根于非结构化数据治理全…

Mac安装nvm,node

新的Mac安装nvm,最简单的是先安装nvm,再安装node,官网示例代码也是这么整的,如果已经安装了node,不要慌 多几步终端操作可以“没有如果”。分两种情况:1,还没安装node,直接装nvm&…

【C++】初步认识C++

1. 初识C1.1 C概念相关1.2 C发展史及其重要性1.2.1 发展史1.2.2 重要性 2. C关键字3. 命名空间4. 输入和输出 个人主页:C_GUIQU 归属专栏:【C学习】 1. 初识C 1.1 C概念相关 C语言是结构化和模块化的语言,适合处理较小规模的程序。 【来源】…

ctfshow-web入门-命令执行(web118详解)Linux 内置变量与Bash切片

输入数字和小写字母,回显 evil input 查看源码,发现这里会将提交的参数 code 传给 system 函数 使用 burpsuite 抓包进行单个字符的模糊测试 fuzz: 发现过滤掉了数字和小写字母以及一些符号,下面框起来的部分是可用的 结合题目提…

【C++】开源:命令行解析库CLI11配置与使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍命令行解析库CLI11配置与使用。 无专精则不能成,无涉猎则不能通。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&#x…

ETCD概述--使用/特性/架构/原理

ETCD概述 ETCD是一个高度一致的分布式键值存储, 它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据(高可用, 强一致性)​全局的配置服务中心. 本文将介绍其特性、相关操作和常见的应用场景. 如果想了解更多, 请查阅我的技术博客: https://dingyuqi.com 特性 …

新章节:全设备通用调度算法-通讯重构

新章节:全设备通用调度算法-通讯重构 文章目录 新章节:全设备通用调度算法-通讯重构前言一、重构了TCP和UDP通讯二、优化了OPC和OPCUA三、升级了监控客户端四、升级了通讯的图形化其他升级 前言 现在真的很懒也很少写代码了,写代码和更新进度…

webSocket网页通信---使用js模拟多页面实时通信

webSocket是什么 WebSocket是一种先进的网络技术,它提供了一种在单个TCP连接上进行全双工通信的能力。传统的基于HTTP的通信是单向的,即客户端发起请求,服务器响应请求,然后连接关闭。但是,WebSocket允许服务器和客户端…