设计模式
文章平均质量分 74
Splaying
Studying
展开
-
C++设计模式:中介者模式(十五)
定义:用一个中介对象来封装(封装变化)一系列的对象交互。中介者使各个对象不需要显示的相互引用(编译时依赖 -> 运行时依赖),从而使其耦合松散(管理变化),而且可以独立地运改变它们之间的交互。在软件构建过程中,经常会出现多个对象相互关联交互的情况,对象之间常常会维持一种付啊的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。在这种情况下,我们可以使用一个“中介对象”来管理对象之间的关联关系,避免相互交互的对象之间的紧耦合引用关系,从而更好地抵御变化。原创 2024-04-22 13:26:43 · 465 阅读 · 0 评论 -
C++设计模式:适配器模式(十四)
定义:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作。在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但新环境要求的接口是这些现存对象所不满足的。如何应对这种“迁移的变化”?如何既能利用现有对象的良好视线同时又能满足心得应用环境所要求的接口?原创 2024-04-21 13:41:30 · 461 阅读 · 0 评论 -
C++设计模式:代理模式(十三)
增加一层”是软件系统重对许多复杂问题的一种常见解决方法。在面向对象系统中,直接使用某些对象会带来很多问题,作为间接层的proxy对象便是解决这一问题的常用手段。具体proxy设计模式的实现方法、实现粒度都相差很大,有些可能对单个对象做细粒度的控制,如copy-on-write技术,有些可能对组件模块提供抽象代理层,在架构层次对对象做proxy(例如aop)Proxy并不一定要求保持接口完整的一致性,只要能够实现间接控制,有时候损失一些透明性也是可以接受的。原创 2024-04-13 22:25:41 · 1051 阅读 · 0 评论 -
C++设计模式:门面模式(十二)
接口隔离”模式:在组建构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来相互紧密关联的接口是一种常见的解决方案。门面设计模式定义:为子系统中的一组接口提供一个一致(稳定)的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用(复用)。上述A方案的问题在于组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的烟花,这种过多的耦合面临很多变化的挑战。如何简化外部客户程序和系统间的交互接口?原创 2024-04-12 16:16:20 · 714 阅读 · 0 评论 -
C++设计模式:享元模式(十一)
概述:享元模式和单例模式一样,都是为了解决程序的性能问题。面向对象很好地解决了"抽象"的问题,但是必不可免得要付出一定的代价。对于通常情况来讲,面向对象的成本大豆可以忽略不计。但是某些情况,面向对象所带来的成本必须谨慎处理。定义:运用共享技术有效地支持大量细粒度的对象。在软件系统中采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,而带来很高的运行时代价——主要指内存需求方面的代价。如何避免大量细粒度对象问题的同时,让外部客户程序仍然能够透明地使用面向对象的方式来进行操作?原创 2024-04-11 18:41:32 · 607 阅读 · 0 评论 -
C++设计模式:单例模式(十)
由于程序运行CPU会进行指令的重排序,如果执行的指令是132顺序,A线程执行完13之后并没有完成对象的初始化、而这时候转到B线程;不能重复创建、也必须保证这个对象在多线程使用过程中不会因为创建而产生数据安全问题,即多线程抢占的创建这一个对象。可以看到实例化不止一个单例对象,这一现象违反了单例的思想,因此需要在多线程抢占创建时进行互斥(mutex)对外暴露一个public方法获取该对象,如果在获取时发现该对象为空,那么进行实例化,否则直接返回。因此可以看到实例化只有一次,多次获取到的对象的地址属于同一个。原创 2024-04-10 18:55:40 · 923 阅读 · 0 评论 -
C++设计模式:构建器模式(九)
定义:将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化)在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对象用一定的算法构建而成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定如何应对这种变化?如何提供一种“封装机制”来隔离出“复杂对象的各个部分”的变化,从而保持系统中的“稳定构建算法”不随着需求改变而改变?原创 2024-04-10 17:02:14 · 628 阅读 · 0 评论 -
C++设计模式:原型模式(八)
定义:使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象。在软件系统中,经常面临着“某些结构复杂的对象”的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是它们却拥有比较稳定一直的接口如何应对这种变化?如何向“客户程序(使用这些对象的程序)”隔离处“这些易变对象”,从而使得“依赖这些易变对象的客户程序”不随着需求改变而改变?个人理解:当一个类对象创建复杂、或者需要当前状态且当前状态这个对象又不允许被破坏的情况下,为了重复利用就可以考虑使用原型模式来clone一个对象。原创 2024-04-09 14:18:24 · 714 阅读 · 0 评论 -
C++设计模式:抽象工厂模式(七)
抽象工厂定义:提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类动机:在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作。如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制来避免客户程序和这种“多系列具体对象创建工作”的紧耦合?个人理解:在工厂方法的基础上套上了一层封装接口,封装的意义就是为了在工厂方法的基础上返回一套或者同类的相互依赖的一系列对象!原创 2024-04-09 10:45:22 · 587 阅读 · 0 评论 -
C++设计模式:工厂方法模式(六)
对象创建模式:通过对象创建模式绕开new,来避免对象(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。PrototypeBuilder工厂模式定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子类。动机在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。如何应对这种变化?原创 2024-04-08 16:03:13 · 997 阅读 · 0 评论 -
C++设计模式:桥模式(五)
桥模式定义:将抽象部分(业务功能)与实现部分(平台实现)分离,使他们可以独立地变化引入动机由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个维度的变化如何应对这种“多维度的变化”?如何利用面向对象技术来使用类型可以轻松地沿着两个乃至多个方向变化,二部引入额外的复杂度?Bridge模式使用“对象间的组合关系”解耦了抽象和实现之间固有的绑定关系,使得抽象和实现可以沿着各自的维度来变化。所谓抽象和实现沿着各自维度的变化,即“子类化”它们。原创 2024-04-07 14:51:53 · 705 阅读 · 0 评论 -
C++设计模式:装饰器模式(四)
装饰器模式定义:动态(组合)地给一个对象增加一些额外的职责。就增加功能而言,Decorator模式比生成子类(继承)更为灵活(消除重复代码 & 减少子类个数)。在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致更多子类的膨胀。如何使“对象功能的扩展”能够根据需要来动态地实现?同时避免“扩展功能的增多”带来的子类膨胀问题?原创 2024-04-06 14:18:29 · 1169 阅读 · 0 评论 -
C++设计模式:观察者模式(三)
观察者模式定义:定义对象间的一种1对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生比改变时,所有依赖于它的对象都得到通知并且自动更新再软件构建过程中,我们需要为某些对象建立一种“通知依赖关系“——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,僵尸软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。原创 2024-04-05 19:38:29 · 961 阅读 · 0 评论 -
C++设计模式:策略模式(二)
定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化),该模式使得算法可独立于使用它的客户程序(稳定)而变化(扩展,子类化)在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都硬编码到对象中,将会使对象变得异常复杂;而且有时候支持不适用的算法也是一个性能负担(代码段过长)如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?Strategy及其子类为组件提供了一系列的可重用的算法,从而可以使得类型在运行时。原创 2024-04-05 13:52:31 · 1261 阅读 · 0 评论 -
C++设计模式:TemplateMethod模式(一)
定义一个操作中的算法的骨架结构(稳定),而将一些步骤延迟(变化)到子类中。Template Method使得子类可以不改变(复用)一个算法的骨架结构即可重定义(override重写)该算法的某些特定步骤在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但是各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现如何在确定稳定操作结构的前提下,来罗应对各种各个子步骤的变化或者晚期实现需求?原创 2024-04-03 15:21:43 · 1376 阅读 · 0 评论 -
代理模式
1. 代理模式介绍代理模式:为其他对象提供一种代理以控制对这个对象的访问,通过代理对象访问目标对象,这样做的好处是可以在目标对象实现的基础上,进行额外功能的增加,实现对目标对象的拓展!主要解决:比如对象创建开销很大,或者需要安全控制的对象,或者需要进程外的访问,直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。代理形式:主要分为三种模式:静态代理、动态代理、Cglib代理(特殊的动态代理)。2. 静态代理代理对象Proxy和目标对象原创 2021-05-09 17:33:21 · 101 阅读 · 0 评论 -
原型模式与深浅拷贝
1. 原型模式原型模式:用于创建重复的对象同时又能保证性能。属于创建型设计模式的范畴,它提供了一种创建对象的最佳方式。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。2. 克隆羊问题2.1、传统创建克隆对象class Sheep{ private String name; pri原创 2021-05-06 15:52:14 · 208 阅读 · 0 评论 -
单例设计模式
1. 单例模式介绍单例设计模式:采取一定的措施保证整个软件应用中对某个类只能存在一个对象实例。并且该类只对外暴露一个public方法用来获得这个对象。常见的单例设计模式:mybatis的SqlSessionFactory对象,通过它可以获取SqlSession对象用于连接数据库从而进行对数据库的操作;SqlSessionFactory对象是一个重量级的对象、不应该重复创建、销毁。因此使用mybatis框架时都会采用单例的方式加载SqlSessionFactory对象。2. 单例设计模式的6原创 2021-05-02 23:04:16 · 211 阅读 · 0 评论 -
UML类图
1. UML简介UML:统一建模语言,是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果。UML本身是一套符号的规定,就像数学符号一样,这些符号用于描述软件模型中的各个元素和他们之间的关系。比如类、接口、实现、泛化、依赖、组合、聚合…2. UML基本符号含义2.1、类、抽象类、接口的表示普通类:直接写类名,属性、方法。抽象类:类名是斜体,属性,方法。接口:在接口名上方加入<< interface >>,再写原创 2021-05-02 11:13:38 · 1653 阅读 · 1 评论 -
合成复用原则
合成复用原则:尽量使用合成 / 聚合的方式,减少使用继承。找出应用可能需要变化之处,它爸妈独立出来,不要和那些不需要变化的代码混在一起。针对接口编程,而不是针对实现编程。为了交互对象之间的松耦合设计而努力。...原创 2021-05-01 21:28:50 · 186 阅读 · 0 评论 -
迪米特法则
1. 基本介绍迪米特法则又叫最少知道原则,即一个类对自己所依赖的类知道的越少越好。换句话说,被依赖的类无论多么复杂,都应该将逻辑封装在自身类的内部;除了对外提供public接口,不对外泄露任何信息。简单点说一个对象应该对其他对象保持最少的了解。迪米特法则更简单的定义:只与直接的朋友通信;直接的朋友:只要两个对象之间有耦合关系就说这两个对象之间是直接朋友关系。耦合的方式有很多种:依赖、关联、组合、聚合… 例如:成员变量、方法参数、方法返回值中的类。非直接的朋友:出现在局部变量中的原创 2021-05-01 20:12:09 · 142 阅读 · 0 评论 -
开闭原则
1. 基本介绍开闭原则:又名OCP原则(Open Close Principle),是最基本、最重要的设计原则开闭原则提倡的是对模块、函数(方法)应该对扩展开放(提供方),对修改关闭(使用方);当软件需要变化时,尽量通过扩展软件实体的行为来实现变化,而不是通过修改已有的代码来实现变化。2. 案例分析2.1、案例1Shape图形类中有一个表示图形类型的变量shapeType;Rectangle、Circle类继承Shape图形类;GraphUser使用者类根据shapeType的不同原创 2021-05-01 15:15:34 · 125 阅读 · 0 评论 -
里氏替换原则
1. 基本介绍里氏替换原则阐述的思想是:如何正确的使用继承。2.1、OOP继承的思考与说明父类中凡是以及实现好的方法,实际上是在设定规范和契约;虽然它不强制要求所有的子类必须遵循这些契约,但是如果子类对这些已经实现的方法任意修改,就会对整个继承体系造成破坏。继承在给程序带来便利的同时,也带来了弊端;比如使用继承会给程序带来侵入性,程序的可移植性降低,增加对象之间的耦合,如果一个类被其他的类所继承则当这个类需要修改时,必须考虑到所有的子类,并且父类修改后所有涉及到子类的功能都有可能产生故障。原创 2021-05-01 13:38:41 · 92 阅读 · 0 评论 -
依赖倒置原则
1. 基本介绍依赖倒置的中心思想是面向接口编程,使用接口或者抽象类的目的是制定好规范,而不涉及任何具体的操作,把展现细节的任务交给实现类去完成。抽象不应该依赖细节,细节应该依赖。即高层的模块不应该依赖低层模块,二者都应该依赖其抽象。## 2. 案例分析现在的生活是手机在手天下我有,假设现在有多种接受消息的方式,并且接受各式各样的消息。2.1、案例1有一个Person类,并且持有一个接受消息的方法。另外有两种接受消息的方式:微信、电子邮件都是为了获得消息。class Email{原创 2021-05-01 10:59:32 · 119 阅读 · 2 评论 -
接口隔离原则
1. 基本介绍客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。简单点说只实现需要用到的接口方法,对于不需要的方法不实现。类A通过类B执行1、2、3这三个方法;类C通过类D执行1、4、5这三个方法。而B类中很明显有4、5方法是不会使用的,D类中的2、3方法不会使用,这就不满足接口隔离原则。原因是因为接口囊括的方法太多,需要将接口向小划分为更多的接口。2. 案例2.1、案例1根据介绍中的UML图不难写出如下代码。interface interface1{原创 2021-04-30 21:00:39 · 237 阅读 · 1 评论 -
单一职责原则
1. 基本介绍对类来说,一个类应当只负责一项具体的职责,而不应该负责多项职责;例如对类A来说,如果类A负责职责A1、职责A2,当需求A1变更而更改类A时,可能会导致职责A2发生错误。这样就被认为类A的粒度不够细,是一种粗粒度的表现,需要对类A进行分解以尽量达到细粒度为原则。2. 案例分析2.1、案例1假设现在有一个Vehicle类表示各式各样的交通工具;而我们知道交通工具只是一个笼统的概念,并没有细化到是哪一类型的交通工具?天上飞的、还是地上跑的、还是水里游的…class Vehicle{原创 2021-04-30 18:36:58 · 145 阅读 · 1 评论