热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

golang设计模式(续二)

责任链模式(ChainofResponsibility)介绍责任链模式:将请求处理者串成链,依次尝试处理请求,依次解耦请求和处理者;·责任链模式将任务处

责任链模式(Chain of Responsibility)

介绍

   责任链模式:将请求处理者串成"链",依次尝试处理请求,依次解耦请求和处理者;

   ·责任链模式将任务处理者划分先后次序,依次尝试,直到任务被处理;

   ·每个处理者存储自己的下一环;任务开始时选择最靠前的处理者试图处理任务;

   ·在遇到自己无法处理的情况,传递给自己的下一环来处理;

场景

   ·适用于单个任务,多个处理者;

   ·需要依次尝试处理者;

实现

   1.公司里leader、经理和CEO有不同额度的报销限额;

   2.leader报销不了的金额交给经理,而经理将自己处理不了的给CEO处理;

   3.张三要报销200元,leader就能批准;

   4.李四要报销8000元,leader报销不了,就交给经理,经理也处理不了,最后交给CEO报销;


蝇量模式(Flyweight)

介绍

   蝇量模式:使用一个对象来存储和模拟多个虚拟对象,大大减少多个对象的内存占用;

   ·实例化多个相似实例会占用较多内存空间,蝇量模式使用一个对象类型变量保存多个对象的属性,以一个对象控制多个对象;

   ·蝇量模式可以极大地减少内存占用,也可以方便对多个对象进行统一管理;

   ·实例一旦实现了蝇量模式,那么单个实例就无法再独立拥有不同的行为;

场景

   ·有很多相似对象,拥有相同的属性和方法;

   ·多个对象只会被统一调用;

实现

   1.在一片森林中,有很多大叔,他们都只有高度一个属性;

   2.将多个大树的属性保存一个森林对象的map中;

   3.调用森林的砍伐方法,砍伐森林中所有的树


解释器模式(Interpreter)

介绍

   解释器模式:定义一种方法和对应的解析器,使用解释器解释此方法的语句来执行;

   ·解释器模式需要上下文类来定义和存储上下文,解释器类用来将语句来翻译成可执行程序;

   ·解释器扩展和改变文化非常简单,构建完成后可以方便的数据格式;

   ·解释器模式会将非终结表达式递归解释,直到解释为终结表达式;

场景

   ·解释器模式适用于数据结构不规则,但数据要素相同的情况;

   ·语法不能太复杂,复杂的最好使用解释型语言来实现以降低复杂性;

实现

   1.在php中,php环境是上下文;

   2.字符串值不能再向下解释了,如"hello","greeting"都是终止符;

   3.在上下文中定义了两个变量$greeting = "hello"; $test = "greeting";

   4.现在来解释变量 $test = "hello";


中介者模式(Mediator)

介绍

    中介者模式:通过一个中介对象封装多个对象之间的交互,解耦各个对象之前的相互依赖;

    ·对象之间通过中介者进行交互,不必再显示调用目标对象;

    ·中介者对对象之间的关系进行了封装,减少了对象之间的耦合,使得对象可以独立改变和复用;

    ·中介者模式与适配器模式和代理模式的不同之处:三者都通过中间对象解决对象之间的沟通问题,但他们要解决的问题和解决问题的对象都不同;

场景

   ·中介者模式适合多对多的对象交互情况;

   ·中介者适合对象之间交互较多,依赖复杂的情况;

实现

    1.联合国作为多个国家之间的中间人存在,各国家之间通过联合国沟通;

    2.法国和韩国尝试通过联合国隔空对话;

    3.他们双方只向联合国喊话,并从联合国处获取对方国家的回应;


备忘录模式(Memento)

介绍

   备忘录模式:使用一个备忘录对象记录并保存对象内部状态,并能随时恢复到保存的状态;

   ·备忘录对象是一个类似于目标对象的轻量级对象,它保存着目标对象的可变属性;

   ·备忘录保管者可以保存多个备忘录,并将对象恢复到任一时刻;

场景

   ·备忘录模式适用于需要保存对象历史状态用以支持撤销的场景;

实现

   1.时光掌控者保存着许多人类世界的"时间快照";

   2.小明18岁身高175,体重70,时光掌控者此时获取小明的信息产生了一个快照;

   3.小明在不停地长大,80岁时身高170,体重65;

   4.时光掌控者选择小明18岁的快照对小明进行了恢复,小明又回到了18岁;


原型模式(Prototype)

介绍

    原型模式:通过复制原型对象再修改属性的方式来快速创建新对象;

    ·原型模式通过抽象多个对象的相同属性和方法来设置一个原型;

    ·原型模式可以通过原型对象设置对象的基本属性,减少创建出的对象的开放;

    ·原型模式使得调用者只知道对象的原型而不必了解创建过程即可创建一个新对象;

场景

    ·原型模式适用于对象较大或创建过程较复杂的情况;

    ·适用于需要创建多个有共同"原型"的对象,也即它们拥有大部分共同属性;

实现

    1.据说国家仪仗队的队员都是年龄20岁,身高180、体重72kg的男性士兵;

    2.抽象一个"年龄20岁、身高180、体重72kg"的人作为仪仗队员的"原型";

    3.创建一个仪仗队原型,并设置姓名来产生一个真实的仪仗队员对象;


访问者模式(Visitor)

介绍

    访问者模式:将对一些对象的访问过程抽象出类,以实现在不改变对象的前提下对这些对象添加操作:

    ·访问者模式分离对象的数据结构和数据操作;

    ·访问者模式将数据的访问方法集中到一个类中作为访问者,便于对数据访问的统一管理;

    ·如果数据有添加或删除,需要修改多个访问者;

场景

    ·访问者模式适用于数据结构稳定的类;

    ·对对象的同一种数据有多种不同的操作方式;

实现

    1.超市里的商品都有名称和价格两种属性,顾客使用购物车保存了要买的商品;

    2.设置一个打印机访问者,访问并打印顾客购物车内的商品名称;

    3.如果要添加一个商品价格计算器,只需要实现与打印机相同的访问者接口,访问并计算购物车中商品的价格;


总结

    根据设计模式所针对的问题,将设计模式分为三类:

    ·创建性:创建型模式针对对象的创建。包括:工厂模式、单例模式、生成器模式、原型模式;

    ·行为型:行为型模式针对对象的行为,如对象之间的通信、职责分配。包括:策略模式、观察者模式、状态模式、模板模式、命令模式、迭代器模式、责任链模式、中介者模式、解释器模式、备忘录模式、访问者模式。

     ·结构型:结构型模式针对如何实现对象的结构。包括:装饰者模式、适配器模式、外观模式、桥接模式、组合模式、代理者模式、蝇量模式。


推荐阅读
  • 千万不要错过的后端[纯干货]面试知识点整理 I I
    千万不要错过的后端【纯干货】面试知识点整理IIc++内存管理上次分享整理的面试知识点I,今天我们来继续分享面试知识点整理IIlinuxkernel内核空间、内存管理、进程管理设备、 ... [详细]
  • 认真一点学 Go:18. 并发
    收录于《Go基础系列》,作者:潇洒哥老苗。>>原文链接学到什么并发与并行的区别?什么是Goroutine?什么是通道?Goroutine如何通信?相关函数的使用?sel ... [详细]
  • funcReadXlsx(c[]CmdbTest,SheetNamestring)error{打开文件,如果文件不存在创建,存在就打开path:.cm ... [详细]
  • 按照之前我对map的理解,map中的数据应该是有序二叉树的存储顺序,正常的遍历也应该是有序的遍历和输出,但实际试了一下,却发现并非如此,网上查了下,发现从Go1开始,遍历的起始节点就是随机了,当然随机 ... [详细]
  • 七、Golang之切片(slice)-由于数组的长度是固定的,所以有很多的局限性,所以今天讲切片,切片是一个拥有相同类型且长度可变的有序集合,切片和数组两种不同的数据类型,它是基于 ... [详细]
  • golang 解析磁力链为 torrent 相关的信息
    其实通过http请求已经获得了种子的信息了,但是传播存储种子好像是违法的,所以就存储些描述信息吧。之前python跑的太慢了。这个go并发不知道写的有没有问题?!packag ... [详细]
  • 本文主要分享【go协程模型】,技术文章【【GORM】模型关系-HasOne】为【VivaPython】投稿,如果你遇到GoWeb相关问题,本文相关知识或能到你。go协程模型一、概述HasO ... [详细]
  • 目录在Go语言项目中使用Zap日志库介绍默认的GoLogger日志库实现GoLogger设置Logger使用LoggerLogger的运行GoLogger的优势和劣势优势劣势Ube ... [详细]
  • Go冒泡排序练习
    package main要求:随机生成5个元素的数组,并使用冒泡排序对其排序  从小到大思路分析:随机数用mathrand生成为了更好 ... [详细]
  • [Redis 系列]redis 学习六,redis 事务处理和监控事务
    【Redis系列】redis学习六,redis事务处理和监控事务写在前面我们学过的事务都是保证原子性的,但是redis的事务中执行多个指令,是不保证原子性的redis事务的本质就是 ... [详细]
  • Go 快速入门指南命令行参数
    命令行参数个数调用os包即可。获取参数个数,遍历参数packagemainimport(fmtos)funcmain(){fmt.Printf(Numberofargsi ... [详细]
  • 集成第三方库,自检测读取配置文件。文件读取,结构体定义,接口实现,错误返回,库解析,适合新同学练手。思路文件读取获取字节流文件类型分析,确定解析api集成第三方解析api管理器定义 ... [详细]
  • 小编给大家分享一下Golang端口复用测试的实现方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有 ... [详细]
  • Channel是Go中的一个核心类型,你可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication)。类型T表示任意的一种类型双向:chan ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
author-avatar
117061771_af0556
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有