自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(28)
  • 收藏
  • 关注

原创 数据结构之树结构

在PHP语言中,我们可以用类或面向对象的方法实现树,以下是几种常见树的原理和PHP代码实现。平衡树是一种自平衡二叉搜索树,在插入或删除节点后能够通过旋转操作使得所有节点的左右子树高度差不超过1,从而避免树退化为链表。其中最常见的平衡树是AVL树。二叉树是树的一种特殊形式,每个节点最多有两个子节点,左子节点小于父节点,右子节点大于父节点。红黑树也是一种自平衡二叉搜索树,与AVL树相比,其旋转操作较少,但是节点颜色的变化较多。以上是几种常见的树的类型和原理,对于其他种类的树可参考相关资料进行学习和实现。

2023-05-06 16:26:07 77

原创 数据结构之哈希表

getIndex方法用于计算key在哈希表中的索引位置,insert方法用于向哈希表中插入元素,search方法用于查找元素,delete方法用于删除元素。在PHP中实现一个哈希表,其本质是将关键字key映射到一个整数下标位置上,从而可快速搜索哈希表中的元素。哈希表是一种数据结构,它提供了快速的插入和查找操作,其基本原理是通过哈希函数将关键字映射到一下整数值,并使用散列表在该位置存储关键字。在存储位置上存储value,当哈希函数在不同的key中产生相同的哈希值时,选择后来的数据项,并将其添加到链表中。

2023-05-06 16:02:04 51

原创 数据结构之栈

在上述示例代码中,我们首先定义了一个Stack类,用于实现栈的基本操作。push方法用于向栈中添加元素,pop方法用于从栈中移除元素,peek方法用于返回栈顶元素,isEmpty方法用于检查栈是否为空。当用代码实现一个栈时,需要确保插入栈的数据不是无效值。入栈是指向栈顶添加元素,出栈是指从栈中移除元素。总而言之,栈是一个非常常用的数据结构,用于表示先进后出(LIFO)的序列,常用于算法和系统设计等许多场景。在PHP中实现一个栈,通过使用数组和指针来操作,在插入和移除元素时能保证时间复杂度为O(1)。

2023-05-06 15:54:10 50

原创 数据结构之链表

在上述示例代码中,我们首先创建了一个Node类,该类代表链表的节点,其包含了要存储的数据和指向下一个节点的指针。其中,addNode方法用于添加节点到链表,deleteNode方法用于删除节点,showLinkedList方法用于打印出整个链表的内容。链表是由一组节点组成的,每个节点包含一个值和一个指针,指向下一个节点。总而言之,链表是一种灵活的数据结构,其设计初衷是在程序运行时动态添加和删除节点,适用于许多编程问题。在PHP中实现链表,以对象和引用为基础,通过添加和删除节点和修改指针来操作链表。

2023-05-06 15:51:58 51

原创 vue的实现原理

Vue.js 通过 Object.defineProperty()(ES5 特性)对属性进行劫持,当属性发生改变时,会触发响应式更新机制,即自动更新相关依赖的数据,从而自动更新视图。Vue.js 的模板是基于 HTML 的,当解析时,Vue.js 会解析指令(如 v-model、v-bind 等),并把它们转化成相应的数据绑定。Vue.js 采用虚拟DOM,比较真实DOM的变化,当数据发生变化时,会计算新旧虚拟DOM树的差异,然后通过打补丁的方式来更新真实DOM。

2023-04-29 15:00:56 92

原创 数据结构和算法简介

常见的算法包括排序算法(如冒泡排序、快速排序、堆排序等)、查找算法(如二分查找、哈希查找等)、图形算法(如最短路径算法、最小生成树算法等)等等。通过合理的选择和使用数据结构和算法,可以大大提高程序的性能和效率,从而更快速、更安全地完成各种任务。此外,数据结构和算法是计算机科学的重要基础,在计算机领域的各个方面都有广泛的应用,也是从事计算机相关职业的必备知识之一。总之,掌握数据结构和算法是成为一名优秀的计算机程序员的重要步骤,可以帮助您提高编程技能、编写高效且易于维护的代码,并解决来自各种渠道的复杂问题。

2023-04-29 15:00:37 92

原创 设计模式之原型模式(二十一)

我们还创建了一个EmployeeRegistry类,用于记录员工信息,并使用原型模式来复制员工对象。这个例子说明了原型模式的使用场景和作用,即在需要大量创建相似对象的场景中,使用该模式可以提高程序的性能并减少代码的重复。在该类中,我们使用Map来记录已注册的员工,并提供了addEmployee方法用于添加新员工,getEmployee方法用于获取员工信息。由于原型模式需要让对象实现Cloneable接口,所以在getEmployee方法中,我们使用clone方法获取新的员工对象。

2023-04-29 15:00:21 26

原创 设计模式之建造者模式(二十)

Product类定义了产品的属性,Builder接口定义了产品构造的抽象方法,ConcreteBuilder类实现了Builder接口的方法,从而实现了具体的产品构造过程。Director类负责构造过程的执行,即调用各个具体的建造者实现产品的构造,并且在产品构造完成后返回一个具体的产品实例。建造者模式(Builder pattern)是一种创建型设计模式,它的主要目的是将一个复杂对象的构造过程与其表示分离,从而使同样的构建过程可以创建不同的表示。

2023-04-29 14:59:53 24

原创 设计模式之中介者模式(十九)

中介者模式(Mediator Pattern)是一种行为型设计模式,也叫作调停者模式,它通过减少对象之间的直接通信来减少对象之间的耦合。在中介者模式中,所有对象的交互都是通过一个中介者对象来完成的,而不是直接进行交互。这个中介者对象负责协调不同对象之间的交互,从而降低了对象之间的耦合度,同时也使得对象之间的通信更加统一和简化。例如,一个公司的员工之间可能需要相互交流联系,而员工之间的关系可能非常复杂。这时,可以引入一个中介者,如公司的内部邮件系统,来协调员工之间的交互,降低对象之间的耦合度。

2023-04-28 16:11:23 40

原创 设计模式之中介者模式(十八)

例如,在一个GUI界面中,当一个控件发生变化时需要更新其他控件的状态,这些控件可能在同一台电脑的不同位置,而且这些位置可能会发生变化,这时需要使用中介者模式来进行控制。具体中介者对象(ConcreteMediator)实现中介者接口,并保存一组被管理对象(Colleague),这些被管理对象需要在其中相互交互,但不需要彼此直接通信。中介者模式的核心思想是封装互相作用的对象之间的交互行为,从而使这些对象之间的耦合度降低,只与中介者对象进行交互。

2023-04-28 16:11:14 61

原创 设计模式之备忘录模式(十七)

在这个示例中,Originator类表示发起人,它可以设置和获取状态,并创建备忘录以存储当前状态。备忘录模式(Memento Pattern)是一种行为型设计模式,也叫做快照模式,它允许在不暴露对象实现细节的情况下保存和恢复对象的状态。备忘录模式将对象的状态保存到一个备忘录对象中,以便以后可以将其恢复到之前的状态。备忘录模式的使用场景包括:需要保存和回复一个对象的状态,以便在需要时恢复它;需要提供可以撤销的操作。在我们的示例中,我们设置了发起人的状态,然后将备忘录添加到管理者类中。

2023-04-28 16:11:06 35

原创 设计模式之访问者模式(十六)

在上面的示例中,Product是商品接口,包含一个accept方法,该方法接收一个ProductVisitor访问者对象,用于实现对商品的访问。这种模式经常应用于解释器、编译器等场景中,例如我们可以使用访问者模式来实现XML或JSON数据的解析,针对不同类型的节点采用不同的操作方式。例如,我们可以考虑一个电商系统中的商品接口(Product),其中的商品可以是书籍、食品、服装等不同种类,而我们又需要对这些商品进行不同的操作(计算价格、打折、打印详情等等)。访问者模式是将数据结构与算法分开处理的一种方法。

2023-04-28 16:10:54 24

原创 设计模式之责任链模式(十三)

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它通过将请求沿着一个处理链进行传递,将发送者和接收者解耦,以避免将请求发送者与接收者之间的耦合关系硬编码在一起。在Main方法中创建了一个请求处理链,requests数组中的每一项请求都将被这个处理链处理。处理者之间的关系可以是链式结构,每个处理者都可以处理请求或选择将请求传递给下一个处理者。通过责任链模式,我们可以根据具体场景来定制链的形式和长度,实现对请求的自由处理。

2023-04-28 16:10:17 24

原创 设计模式之享元模式(十五)

内部状态是不变的,可以被共享,而外部状态是可变的,每个对象都需要独立维护。如果我们使用常规的创建墙壁对象的方式,每个墙壁将需要分配一块内存,这可能会导致内存占用过高和性能下降。使用享元模式,我们可以创建一个享元工厂类,它会维护已经创建的墙壁对象,并在需要时返回已创建的对象。在这个例子中,我们可以看到红色墙壁对象被共享了两次,虽然它们的坐标不同,但是它们实际上是同一个对象。在创建墙壁对象时,如果已经存在相同颜色的墙壁,它会返回已创建的对象。首先,需要定义场景中的墙壁类 Wall,它包含了墙壁的内部状态信息。

2023-04-28 16:10:14 27

原创 设计模式之代理模式(十二)

代理模式还可以实现远程代理、虚拟代理、安全代理等功能,非常灵活,是一种常用的设计模式。然后,我们定义一个代理类UserProxy实现UserService接口,并包含一个UserService对象作为属性,用来执行UserService对象的功能。UserProxy代理类可以在UserService对象的功能调用前或调用后,添加一些额外的功能,比如对用户的操作进行记录。代理模式是一种设计模式,它允许我们使用代理对象作为另一个对象的接口,以控制对该对象的访问。

2023-04-28 16:10:07 24

原创 设计模式之命令模式(十四)

在这个例子中,Command是一个接口,ConcreteCommandA和ConcreteCommandB是具体命令类,Receiver是接收者类,Invoker是调用者类。当客户端(Client)执行命令时,它实际上是将一个具体的命令对象传递给调用者(Invoker)对象,并且调用者(Invoker)对象执行该命令。命令模式是一种行为型设计模式,它将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,同时将请求排队或记录请求日志,以及支持可撤销的操作。当需要支持撤销操作时。

2023-04-28 16:10:00 24

原创 设计模式之桥接模式(十)

如果我们要在不同的品牌之间进行组合,如果直接使用继承的方式,就需要针对每一个品牌都去实现一个Car的子类,这样就会导致类的数量爆炸性增长,管理和维护都会变得非常困难。使用桥接模式,我们可以将品牌和车的类进行分离,将品牌作为一个实现部分,车作为一个抽象部分,这样就可以在运行时动态地组合不同的品牌和车的实现,而不需要改变类的数量,这样就可以更灵活地进行搭配。桥接模式将一个类的抽象部分与它的实现部分分离,利用组合的方式,可以让抽象部分和实现部分可以独立地变化,从而达到让两者可以自由的拼合的效果。

2023-04-28 16:09:35 23

原创 设计模式之组合模式(十一)

在组合节点 Composite 中,我们使用了一个 List 来保存其子节点 components,实现了 add() 和 remove() 方法。在组合模式中,我们拥有一个抽象的基类(Component),它定义了一些操作,例如 add() 和 remove() 等。叶子节点(Leaf)是不可再分的单独对象,而组合节点(Composite)则是由更小的组合节点或叶子节点构成,它们均实现了 Component 的接口。组合模式使得客户端能够统一地处理单个对象和对象组合它们的方式。

2023-04-28 16:09:28 26

原创 设计模式之外观模式(九)

外观是客户端与子系统之间的中介对象,它封装了子系统的复杂性,为客户端提供统一的接口。而客户端则是使用外观对象的对象,它通过外观对象调用子系统的方法实现功能。外观模式(Facade Pattern)是一种结构型设计模式,它为复杂的子系统提供一个简单的接口,用于隐藏系统中的复杂性,并将其封装在一个单独的对象中。外观模式属于结构型模式,它降低系统的复杂度,提高了操作的便捷性。通过外观模式,我们可以将系统中复杂的子系统封装起来,从而达到简化系统操作过程的目的。这不仅提高了系统的易用性,也使系统更加易于维护。

2023-04-27 16:49:27 35

原创 设计模式之迭代器模式(八)

在迭代器模式中,我们将集合的遍历方式从集合类中抽离出来,由一个单独的迭代器对象来负责遍历,并且该迭代器对象提供了一系列标准化的接口,使得对集合的遍历更加简单和灵活。在测试代码中,我们先创建一个 ListCollection 类型的对象,然后使用该对象的 add() 方法添加元素,最后通过迭代器的 hasNext() 和 next() 方法遍历集合元素。迭代器模式(Iterator Pattern)是一种行为型设计模式,用于提供一种顺序访问一个集合对象的方法,而无需关心集合的底层实现。

2023-04-27 16:42:50 26

原创 设计模式之状态模式(七)

状态模式的主要作用是将一个对象在不同状态下的行为封装起来,并让状态之间的转换以及行为变化对于客户端透明。状态模式是一种行为型设计模式,它允许对象在其状态发生改变时改变它的行为,而不必采用一堆的条件判断语句。状态模式将对象的行为和状态分离开来,使得状态的改变对于使用者透明化。在上下文中维护着一个状态对象的引用,同时也将所有与状态相关的请求委托给该状态对象处理。3. 具体状态类(ConcreteState):具体状态类实现了状态接口,并封装了上下文对象在该状态下的行为。

2023-04-27 16:39:07 44

原创 设计模式之策略模式(六)

策略模式是一种常用的设计模式,主要用于将算法的实现和调用者分离,从而使算法的实现可以独立于调用者而变化。其基本思想是定义一系列算法,将它们分别封装成策略类,让这些策略类可以相互替换,从而使得算法的变化可以独立于使用算法的客户端代码。在这个例子中,我们使用了策略模式来封装了不同的算法,并且使用Context类将算法的执行和客户端代码分离开来。这个例子中的使用场景是,当我们需要动态地选择不同的算法实现时,可以使用策略模式来实现。此外,它还可以用于封装一系列的业务规则,从而更好的保证代码的可扩展性和可维护性。

2023-04-27 16:38:05 18

原创 设计模式之观察者模式(五)

当被观察者的温度发生改变时,它会通知所有观察者进行更新,这里只有一个CurrentConditionsDisplay观察者,它将被更新并显示新的温度。被观察者维护一个观察者列表,并提供注册和删除观察者的接口。当被观察者状态发生改变时,会遍历观察者列表,通知每个观察者进行更新。观察者模式是一种软件设计模式,用于在对象之间建立一对多的依赖关系,当一个对象状态发生改变时,所有依赖它的对象都将得到通知并自动更新。通过观察者模式,被观察者和观察者之间的耦合度降低,可以方便地扩展和维护系统。

2023-04-27 16:35:44 23

原创 设计模式之装饰器模式(四)

装饰器模式是一种常用的面向对象设计模式,它主要解决了类似于继承等静态方式不灵活、不易扩展以及维护成本高的问题。该模式通过在运行时动态地为对象添加功能,而不需要对源代码进行修改,从而有效地增强了系统的可扩展性和可维护性。

2023-04-27 16:28:45 53

原创 设计模式之适配器模式(三)

适配器模式是一个常用的结构型设计模式,它可以将一个类的接口转换成客户端所期望的另一个接口。适配器模式的核心思想是通过一个适配器作为桥梁来连接两个不兼容的接口,使它们能够相互合作。

2023-04-27 16:27:11 45 1

原创 设计模式之单例模式(二)

单例模式(Singleton Pattern)是一种创建型设计模式,旨在确保一个类只有一个实例,并提供全局访问点。它可以在一个系统或应用程序中创建一个全局对象,从而节省内存和资源,同时提供一种直接的方式来访问该对象。通常情况下,单例模式被用于一些管理资源或状态的类,如配置管理、日志管理或线程池等。

2023-04-27 16:24:03 73 1

原创 设计模式之工厂模式(简单工厂、工厂模式、抽象工厂)(一)

工厂模式是一种常用的面向对象设计模式,它主要解决了对象创建过程中的复杂性和不稳定性问题。该模式将对象创建的责任交给一个工厂类,由工厂类负责根据参数来选择创建并返回正确类型的对象实例。这样做的好处在于,客户端不需要知道具体实现细节,只需通过接口与工厂交互即可获取所需对象,降低了类与类之间的耦合度,从而提高了系统的可扩展性和维护性。通常,工厂模式分为简单工厂模式、工厂方法模式和抽象工厂模式三种。

2023-04-27 16:18:01 112 1

原创 23种设计模式

设计模式是一套被广泛认可的、可重复使用的解决软件设计问题方法。常用的设计模式有23个,它们可以分为三类:创建型模式、结构型模式和行为型模式。

2023-04-27 16:08:19 40 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除