设计模式-行为型模式

设计模式——行为型模式 行为型模式主要关注对象间的通信,它们提供了一种方法来定义对象之间的相互作用,以及怎样分配责任。观察者模式定义了对象之间的一对多依赖关系,当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。System.out.println(“收到消息:” + message);System.out.println(“观察者被通知”);System.out.println(“执行操作”);System.out.println(“算法A”);System.out.println(“算法B”); 阅读详情

原文地址:http://blog.youkuaiyun.com/column/details/pattern.html?&page=1

行为型模式

  • 模版方法模式
  • 策略模式
  • 状态模式
  • 命令模式
  • 迭代器模式
  • 备忘录模式
  • 观察者模式
  • 中介者模式
  • 访问者模式
  • 责任链模式
  • 解释器模式

模版方法模式

定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。

这里写图片描述

模版模式的核心是一个抽象类。抽象类将实现逻辑的骨架定义好,具体实现的抽象方法有继承的子类去实现。


策略模式

定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。

这里写图片描述

策略模式与模版模式的区别在于:
在模版方法模式中,调用算法的主体在抽象的父类中,而在策略模式中,调用算法的主体则是封装到了封装类Context中。


状态模式

定义:状态模式允许一个对象在其内部状态改变的时候改变其行为。这个对象看上去就像是改变了它的类一样。

这里写图片描述

简单地说:一个Context对象的状态会发生改变,在他状态发送改变后,若调用request方法,具体的操作是有目前状态的handle方法来操作的,就如同request方法的发生了变化,换种说法,就如同Context对象看上去是改变了类。

状态模式与策略模式有相似之处,都是把具体的处理逻辑抽象封装出来,区别在于:
状态模式将各个状态所对应的操作分离开来,即对于不同的状态,由不同的子类实现具体操作,不同状态的切换由子类实现,当发现传入参数不是自己这个状态所对应的参数,则自己给Context类切换状态;而策略模式是直接依赖注入到Context类的参数进行选择策略,不存在切换状态的操作。


命令模式

定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

这里写图片描述

命令模式的核心在于对命令的封装,即通过将对命令的操作(接受者接口方法的执行顺序等)封装在命令对象的方法中,然后在合适的时间由调用者对象进行调用。调用者Invoker持有一组命令对象的实例。

通过命令对象可以有效降低命令与调用者对于具体操作的耦合,同时可以实现命令的撤销,批量执行等操作。

缺点:过多的简单命令对象创建(几行代码)会造成封装的繁琐。


迭代器模式

定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。

这里写图片描述

迭代器与集合是密不可分的,它可以在隐藏集合对象的内部实现的情况下提供一种有效的遍历集合的方式。


备忘录模式

定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样就可以将该对象恢复到原先保存的状态。

这里写图片描述

发起人对象的某一瞬时状态可以用备忘录对象保存(可以是发起人对象的全部或部分属性值),备忘录有管理角色管理(管理角色保存一组备忘录对象的实例)。在需要还原的时候,可以通过获取管理角色中所保管的备忘录对象来还原发起人的状态。


观察者模式

定义:定义对象间一种一对多的依赖关系,使得当每一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新。

这里写图片描述

如果一个对象的状态发生改变,某些与它相关的对象也要随之做出相应的变化,这时候最佳的解决方案既是观察者模式。

观察者模式一个重要点是注册于被观察者中的观察者集合。


中介者模式

定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。

这里写图片描述

中介者模式是将多个同事类之间的一对多耦合降低成一对一的星状耦合。一般情况下一对多的依赖在程序设计中是允许的,没有必要引用中介这模式。除非在依赖关系过于复杂的情况下,我们才使用中介者降低耦合。


访问者模式

定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

这里写图片描述

    abstract class Element {  
        public abstract void accept(IVisitor visitor);  
        public abstract void doSomething();  
    }  

    interface IVisitor {  
        public void visit(ConcreteElement1 el1);  
        public void visit(ConcreteElement2 el2);  
    }  

    class ConcreteElement1 extends Element {  
        public void doSomething(){  
            System.out.println("这是元素1");  
        }  

        public void accept(IVisitor visitor) {  
            visitor.visit(this);  
        }  
    }  

    class ConcreteElement2 extends Element {  
        public void doSomething(){  
            System.out.println("这是元素2");  
        }  

        public void accept(IVisitor visitor) {  
            visitor.visit(this);  
        }  
    }  
    class Visitor implements IVisitor {  

        public void visit(ConcreteElement1 el1) {  
            el1.doSomething();  
        }  

        public void visit(ConcreteElement2 el2) {  
            el2.doSomething();  
        }  
    }  

    class ObjectStruture {  
        public static List<Element> getList(){  
            List<Element> list = new ArrayList<Element>();  
            Random ran = new Random();  
            for(int i=0; i<10; i++){  
                int a = ran.nextInt(100);  
                if(a>50){  
                    list.add(new ConcreteElement1());  
                }else{  
                    list.add(new ConcreteElement2());  
                }  
            }  
            return list;  
        }  
    }  

    public class Client {  
        public static void main(String[] args){  
            List<Element> list = ObjectStruture.getList();  
            for(Element e: list){  
                e.accept(new Visitor());  
            }  
        }  
    }  

访问者模式的优点

  • 符合单一职责原则:凡是适用访问者模式的场景中,元素类中需要封装在访问者中的操作必定是与元素类本身关系不大且是易变的操作,符合单一职责原则。
  • 扩展性良好:元素类可以通过接受不同的访问者来实现对不同操作的扩展。

引自原文:

但是,访问者模式并不是那么完美,它也有着致命的缺陷:增加新的元素类比较困难。通过访问者模式的代码可以看到,在访问者类中,每一个元素类都有它对应的处理方法,也就是说,每增加一个元素类都需要修改访问者类(也包括访问者类的子类或者实现类),修改起来相当麻烦。也就是说,在元素类数目不确定的情况下,应该慎用访问者模式。所以,访问者模式比较适用于对已有功能的重构,比如说,一个项目的基本功能已经确定下来,元素类的数据已经基本确定下来不会变了,会变的只是这些元素内的相关操作,这时候,我们可以使用访问者模式对原有的代码进行重构一遍,这样一来,就可以在不修改各个元素类的情况下,对原有功能进行修改。

最复杂的行为型模式。


责任链模式

定义:使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。

这里写图片描述

责任链模式其实就是一个灵活版的if…else…语句,它就是将这些判定条件的语句放到了各个处理类中。

如果if中的判断过于负载就可以使用责任链。

但是使用责任链时一定要注意链的顺序,以及避免出现死循环的情况。


解释器模式

定义:给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子。

这里写图片描述

基本用不到。

保姆级教程:在mmdetection中手动计算并可视化P、R、F1值(附完整代码) 本文提供了一份详细的mmdetection教程,指导开发者如何手动计算并可视化精确率(P)、召回率(R)和F1值。通过完整的代码示例和清晰的步骤说明,帮助用户深入理解目标检测模型的性能评估方法,特别适合需要精细分析模型表现的计算机视觉研究人员和工程师。 阅读详情

相关推荐

Trae IDE与Playwright MCP:5分钟实现零代码网页数据抓取

网页数据抓取是数据采集和自动化处理中的基础技术,其核心原理是通过程序模拟浏览器行为,定位并提取页面中的结构化信息。传统方式依赖编写脚本处理网络请求、解析HTML和应对反爬机制,技术门槛较高。而结合AI与自动化工具的新范式,通过自然语言交互即可完成复杂操作,极大降低了技术门槛并提升了开发效率。这种技术价值在于将开发者从繁琐的编码中解放,使其更专注于数据分析和业务逻辑。在数据监控、市场调研、竞品分析等应用场景中,快速获取网页数据是关键需求。本文以Trae IDE集成Playwright MCP为例,演示如何通过

culi3118的博客 498

行为型设计模式(11种)

行为型设计模式(11种)

qq_52793248的博客 6643

基于新张量核范数的TRPCA:多维数据低秩稀疏分解的理论与实践

本文深入探讨了基于新张量核范数的TRPCA(张量鲁棒主成分分析)技术。该技术通过t-product运算和新定义的张量核范数,能有效从多维数据(如视频、彩色图像)中分离低秩背景与稀疏前景/噪声。文章结合理论、核心算法(ADMM、t-SVT)及图像恢复、视频背景建模等实战案例,展示了其在处理复杂多维数据分解任务中的强大优势。

weixin_29173777的博客 269

行为型设计模式

行为型设计模式目的是将多个类或对象相互协作,共同完成单个类或对象无法单独完成的任务。行为型设计模式共11种,分别为解释器模式、模板方法模式、责任链模式、命令模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式、访问者模式。 ......

shaofei_huai的博客 3940

Qt Tab Widget 实战:如何打造一个可动态增删的标签页管理器(附完整代码)

本文深入探讨了使用Qt框架中的Tab Widget控件构建动态标签页管理器的实战方法。通过分析动态增删的核心挑战,提供了完整的C++代码示例,涵盖信号槽机制、页面生命周期管理、上下文菜单实现以及状态持久化等关键功能,帮助开发者打造高效、用户友好的桌面应用界面。

bb456的博客 1043

N5105核显直通PVE:从黑屏到HDMI输出的完整指南

PCI直通能让虚拟机独占物理设备,但核显直通远没有独显那么轻松。Intel核显与CPU、显示输出链路的强耦合使UEFI引导、GOP驱动、驱动签名等环节都成了黑屏陷阱。在PVE虚拟化环境中,通过IOMMU开启、vfio-pci绑定、OVMF固件和Q35机型配合,可以绕过KVM检测,让Windows虚拟机正确驱动核显,从HDMI口输出画面,并解锁Intel Quick Sync硬解能力。这种方案尤其适合N5105等低功耗迷你主机,可作为客厅HTPC、本地视频硬解或依赖硬件加速的轻量工作台。本文基于N5105平台

weixin_31082403的博客 375

设计模式之行为型模式

分类只从每个模式的类图中是否体现了聚合关系,也可以说从他们之间关系的强弱来进行区分,无聚合关系比较弱,有聚合关系就比较强。一:代表只选择一个对象。比如说策略模式,可以有很多的策略但是最后选择的只有一个对象。多:代表需要便利多个对象。比如说中介者模式中的例子,具体中介者可以知道很多的具体的同时,但是同事和同事之间是互相不了解的。对于中介者和同事之见就是一对多的关系。这些行为型设计模式都提供了一种灵活、可复用和可扩展的方式来组织和管理对象之间的交互和通信。

Wzill 1306

二、租用AutoDL服务器与连接教程

点击右上角控制台,选择【租用新的实例】;,我这里使用的是xshell和xftp工具(自行下载)。打开本地目录和服务器目录,直接拖动文件。

zzf021122的博客 1327

设计模式-行为型模式(11种)

将每个算法封装在独立的类中,并使它们可以。

集技术与才华于一体,个人博客网站:nanshuo.icu,公众号:烁烁南光 2327

国网DLT698.45协议——采集系统、数据交换(三)

物理层规定了通信单元或其他终端设备与多功能电表的通信接口,接口的物理与电气特性。常见的物理层传输方式有对于RS485、红外、载波通信等通信信道。将数据包装成可传输的帧格式。1、根据通信配置参数完成端口的初始化配置,通信状态初始化为准备接收状态,初始化相关计数器及缓冲区指针。2、链路层及控制子模块负责通信数据的收发控制,各类超时问题的处理。无通信数据接收时,定时初始化通信端口。3、完成协议帧的解析及应答。

一个bug是bug,多个bug能work 8052

YOLOv11改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进

如今各种网络模型更新迭代越来越快,计算机视觉相关的文章也越来越多,多到一些普通,通用的改进点无法达到发表的要求。本专栏正是解决这个问题!如何寻找创新点?为什么要使用这个模块?如何才能提升模型的精度?这是贯穿我们研究始终的问题。创新点在这个专栏中我已经整理好了,这已经省去了大部分时间,但是当我们使用这些新的模块去优化已有的模型,如何才能提升模型的精度,才是我们要达到的最终目标。当然我们可以使用传统的A+B+C的方法去堆积模块,然后是进行大量的实验去排列组合以实现最终的精度提升,这无可厚非。

Limiiiing的博客 6万+

Java设计模式之行为型模式

定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。

故里有青山,而我心里有你 896

PLSQL Developer安装详细步骤

一、下载安装PLSQL Developer(plsql安装百度也有步骤) 官网下载地址:https://www.allroundautomations.com/registered-plsqldev/ 1、网上自己下载适合自己电脑的安装包(32或64),并解压。 2、打开解压的文件夹,得到以下三个文件(分别是汉化工具,PLSQL安装包、激活码),双击安装,如下图: 3、安装界面,点击next,进入下一步,如图: 4、安装协议界面,此处必须选择“I accept the terms in

Gorden的博客 11万+

行为型设计模式的全面解析

行为型设计模式旨在优化对象之间的交互和职责分配,以提高系统的灵活性和可维护性。主要包括责任链模式、状态模式、解释器模式、中介者模式、备忘录模式和访问者模式等。每种模式都有其特定的应用场景和优缺点。通过深入理解和应用这些模式,开发者可以创建更高效、更易维护的软件系统。

欢迎来到【技术拾光者】,在这里,我们专注分享编程教程、技术趋势、实战案例和优质资源。不定期举办技术问答、专家访谈和职业指导。加入我们,共同探索技术世界,提升技能,拓展职业道路! 1248

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

设计模式概览——行为型模式

前面两篇文章分别整理了设计模式三大类中的创建型模式和结构型模式: 设计模式概览——创建型模式 设计模式概览——结构型模式 今天我们再来整理一下最后一部分,行为型模式。 首先,什么是行为型模式? 行为型模式(Behavioral Pattern)是指对在不同对象之间划分责任和算法进行抽象化的设计模式,它不仅关注类和对象的结构,而且重点关注他们之间的相互作用。 对于一个系统来说,对象不是...

牧羊女 1332

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

设计模式实战精讲:行为型模式

本篇博客包含11种设计模式,自从学习这么多种设计模式后,我的心态也发生了变化,或许不会存在永远按照设计模式来设计的程序,一个项目也可能存在符合多种设计模式的情况,但是无论正确与否,我觉得可读性强的,利于维护的,方便增加功能的项目就是好项目。(例如有三个对象,调用顺序是A->B->C,把所有的项目都先传递给A,A拿到所有的项目后,把属于自己负责的项目留下来,把剩下的传递给B,然后B把属于自己的留下来,把不属于自己的再传递给C)1.定义抽象元素类:定义访问者可调用的函数,访问者通过该函数实现修改元素内的内容。

WildPointer的博客 1156

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C#常见的设计模式-行为型模式

行为型模式是面向对象设计中的一类设计模式,它关注对象之间的通信和相互作用,以实现特定的行为或功能。在C#中,有许多常见的行为型模式,下面将对其中10种行为型模式进行介绍,并给出相应的代码示例。

故事不长丨的博客 1873

【设计模式】4.行为型模式

图说设计模式 软件模式是将模式的一般概念应用于软件开发领域,即软件开发的 总体指导思路或参照样板。软件模式并非仅限于设计模式,还包括 架构模式、分析模式和过程模式等,实际上,在软件生存期的每一 个阶段都存在着一些被认同的模式。 本书使用图形和代码结合的方式来解析设计模式; 每个模式都有相应的对象结构图,同时为了展示对象间的交互细节, 我会用到时序图来介绍其如何运行。

九牧林的博客 902

【设计模式】03-理解常见设计模式-行为型模式(专栏完结)

行为型模式主要用于处理对象之间的交互和职责分配,以实现更灵活的行为和更好的协作。类充当消息代理,它允许用户订阅(on方法)特定的事件,发布(emit方法)事件,以及取消订阅(off方法)事件。当事件被发布时,所有订阅该事件的回调函数都会被执行。到此,【设计模式】专栏的篇章已经完结~文章介绍的是部分常见的设计模式,实际上还有很多设计模式等着大家去学习,后续我有空会补充新的设计模式内容,敬请期待吧~如果你喜欢这篇文章,留下你的三连+订阅~

科技改变世界,技术驱动未来。 1320

【设计模式精讲】行为型模式之职责链模式

职责链模式(chain of responsibility pattern) 定义: 避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求.将接收请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止.在职责链模式中,多个处理器(也就是刚刚定义中说的“接收对象”)依次处理同一个请 求。一个请求先经过 A 处理器处理,然后再把请求传递给 B 处理器,B 处理器处理完后再 传递给 C 处理器,以此类推,形成一个链条。

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

设计模式:行为型模式

设计模式:行为型模式

qq_35763697的博客 1642

设计模式04行为型模式

在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,其中取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。

Sky_小天 1199

设计模式行为型

定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。模板方法如果想要扩展的话,就创建一个新的类来继承模板,将具体的算法的实现进行更改,使用的时候用哪个具体方法,实例化那个具体的对象就可以了。在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。允许一个对象在其内部状态改变时改变它的行为。

郝老三~~~~~~~~~~~~~ 1万+
上一篇: 设计模式-创建型模式
下一篇: 递归设计
AlainGogogo
博客等级 码龄18年 5粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值