草庐IT

23种设计模式总结

抹茶MM 2023-03-28 原文

http://cj723.cnblogs.com

1:简单工厂模式  20210805

  • 简单工厂模式又叫静态方法模式(因为工厂类定义了一个静态方法)
  • 简单工厂模式是属于创建型设计模式,关注于对象的创建。
  • 现实生活中,工厂是负责生产产品的;同样在设计模式中,简单工厂模式我们可以理解为负责生产对象的一个类,称为“工厂类”。
  • 将“类实例化的操作”与“使用对象的操作”分开,让使用者不用知道具体参数就可以实例化出所需要的“产品”类,从而避免了在客户端代码中显式指定,实现了解耦。

    即使用者可直接消费产品而不需要知道其生产的细节

   Input:你指定代表实例的变数,工厂就会返回相应的类的对象实例。

例子:支付方式   https://www.cnblogs.com/hzhhhbb/p/11406771.html

2:策略模式  20210806

  --在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。

  --在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

  --策略模式是一种定义一系列算法的方法从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法减少了各种算法类与使用算法类之间的耦合。

  --策略模式的优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试。

https://www.runoob.com/design-pattern/strategy-pattern.html

3:单一职责原则 20210810

      就一个类而言,有且仅有一个引起它变化的原因。如果一个类承载的职责的过多,就等于把这些职责耦合在一起。一个职责的变化的时候,可能会抑制或者削弱其他职责的能力,这种耦合会导致脆弱的设计。

      当变化发生时候,设计会遭受到意想不到的变化。例子:俄罗斯方块游戏

4:开放-封闭原则 20210810

      对扩展开放,对于更改是封闭的。即面对需求,程序是通过增加新代码来实现的,而不是通过更改来实现的。

     在我们最初写代码的时候,我们是假设不会变化的,当变化发生的时候,我们就创建抽象来隔离以后发生的同类变化。

     开放-封闭原则是整个面像对象设计的核心所在,遵循此原则会使我们的代码可维护,可复用,可扩展,灵活性好。

     开发人员仅对程序中呈现频繁变化的那些部分做出抽象。

5:依赖倒转原则 20210810

      A:高层模块不应该依赖底层模块,两者都应该依赖抽象。

     B:抽象不应该依赖细节,细节应该依赖抽象。

     针对接口编程,不要对实现编程。

     里氏代换原则:子类型必须能够替换掉他们的父类型。(一个软件实体如果使用的是他们父类,那么一定适用于其子类,并且察觉不出父类对象和子类对象的区别。也就是说,在程序里面,把父类替换成子类,程序的行为没有区别。)

     依赖倒转原则可以说是面向对象编程的标志。用哪种语言来编写程序不重要。

     如果编写时考虑的都是如何面向抽象编程,而不是面向细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口类,这样的设计就称为面向对象编程,否则就是过程式的编程。

6: 装饰模式 20210812  人和穿衣服

    有效的把类的核心职责与装饰功能区分开了。为已有功能动态的添加更多功能的一种方式。

   装饰模式提供了这样一种方式,把非核心代码,装饰功能放在单独的类中,并让这个类包装它需要装饰的对象。当需要执行特殊行为的时候,客户代码就可以在运行时候按需要有选择的,按顺序地使用装饰功能包装对象。

  就增加功能来说,装饰模式比增加子类更加灵活。

7:代理模式 20210816 追求模式

   为其他对象提供一种代理以控制对这个对象的访问。

   代理模式其实就是在访问对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。代理就是真实对象的代表。

第一:远程代理,也就是为一个对象在不同的地址空间提供局部代表,这样可以隐藏一个对象存在于不同地址空间的事实。

第二:虚拟代理,是根据需要创建开销很大的对象,通过它来存放实例化需要很长时间的真实对象。

第三:安全代理,用来控制真实对象访问时的权限。一般用于对象应该有不同的访问权限的时候。

第四:智能代理。是指当调用真实的对象时,代理处理另外一些事。如计算真实对象的引用次数,这样当该对象没有引用时候,可以自动释放它。或当第一次引用一个持久化对象时候,将它装入内存。

 8: 工厂方法模式 20210817  学雷锋

     工厂方法模式就是定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。

    工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的。也就是说,工厂方法把简单工厂的内部逻辑判断转移到了客户端。你想要加功能,本来是改工厂类的,现在是修改客户端代码。

9: 原型模式 20210819  写简历

    原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

   其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。

.NET在System命名空间中提供了ICloneable接口,其中就有唯一的一个方法Clone(),只需要实现这个接口就可以完成原型模式了!

    浅复制:复制当前对象的浅表副本。方法是创建一个新对象,然后将该对象的非静态字段复制到该对象。如果对象是值类型的,则对该字段执行逐位复制。如果字段是引用类型的,则复制引用但不复制引用的对象。因此,原始对象及其副本引用同一对象。

                 :浅复制的例子 (MemberwiseClone())

     深复制:把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。

    例子:数据集对象Dataset,Clone():浅复制,Copy():深复制。

 10:模板方法模式 20210823 试卷例子

        当我们要完成在某一细节层次一致的一个过程或一系列步骤,但其个别步骤在更详细的层次上的实现有可能不同的时候,通常考虑用该模式来处理。

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

        特点:通过把不变行为搬移到超类,去除子类中的重复代码来体现优势。

11 : 迪米特法则   20210824  无熟人难办事 

       最小知识法则。如果两个类不需要直接通信,那么这两个类就不必要发生直接的作用。如果一个类需要调用另一个类的方法的话,可以通过第三者转发这个调用。在类的结构设计上,每一个类都应该尽量降低成员的访问权限。

       强调了类之前的松藕合。类之间的藕合越松,越有利于复用。一个处在弱耦合的类被修改,不会对有关系的类造成波及。

12 :外观模式   20210824   牛市股票还会亏钱?

      为子系统中的一组接口提供一个一致的界面,此模式定义了一个高度的接口。这个接口使得子系统更加容易使用。

      何时使用外观模式:① 数据访问,业务逻辑,表示层的层与层之间建立外观Facade,这样可以为复杂的子系统提供一个简单的接口,使得耦合大大降低。

 

有关23种设计模式总结的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 如何在续集中重新加载表模式? - 2

    鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende

  4. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  5. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  6. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  7. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  8. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  9. ruby-on-rails - environment.rb 中设置的常量在开发模式中消失 - 2

    了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl

  10. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

随机推荐