自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(134)
  • 资源 (1)
  • 收藏
  • 关注

原创 设计模式:解释器模式

解释器模式(Interpreter Pattern)是一种行为型设计模式,它给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子。简单来说,它主要用于某些特定类型的问题中,通过定义一个语言的文法,并构建一个解释器来解释该语言中的句子。解释器模式适用于一些特定的问题领域,如编译器的开发、规则引擎的构建等,它能够提供一种简单和直观的方式来解释语言。

2024-04-20 20:10:23 232

原创 设计模式:中介者模式代码案例

在这个系统中,我们有多个设备,如灯光、窗帘、空调等,它们之间需要相互协作以达到智能控制的目的。在一个繁忙的机场,有许多飞机需要起飞、降落、滑行和等待,如果每架飞机直接与其他飞机沟通,情况会变得异常复杂且危险。当我们对灯光说“晚安”(即关闭灯光)时,中介者可以根据预设的场景,通知窗帘拉上、空调调节到适宜的温度等,从而达到智能控制的效果。是中介者,它知道如何协调各个飞机之间的交流。每架飞机通过航空交通管制中心来发送和接收消息,而不是直接与其他飞机通信,这样减少了飞机之间的直接依赖,提高了系统的安全性和效率。

2024-04-20 09:37:52 207

原创 设计模式:中介者模式

中介者模式(Mediator Pattern)是一种行为型设计模式,它通过引入一个第三方对象(中介者)来管理一组对象之间的复杂交互。这些对象通过中介者而不是直接相互通信,从而减少了它们之间的耦合度,使得代码易于维护和扩展。中介者模式是一种有效的方式来减少类之间的直接交互,降低系统的耦合度。它特别适合用于管理复杂的交互和通信。在使用中介者模式时,应该注意不要让中介者类变得过于庞大和复杂。合理地划分中介者的职责,并在必要时拆分中介者,可以帮助维护中介者模式的清晰性和可维护性。

2024-04-20 08:06:17 267

原创 设计模式:访问者模式代码示例

通过类比日常生活场景,我们可以看到访问者模式的核心在于将数据结构和操作解耦,使得我们可以在不改变数据结构的前提下,为元素添加新的操作。在设计系统时,如果遇到类似的需求,可以考虑使用访问者模式。不过,需要注意的是,如果系统中的元素种类经常发生变化,那么这种模式可能会带来维护上的不便。在使用访问者模式时,应该仔细权衡其带来的好处和潜在的复杂性。

2024-04-20 07:53:13 132

原创 设计模式:访问者模式

访问者模式(Visitor Pattern)是一种将算法与对象结构分离的设计模式。这种模式中,可以在不修改已有程序结构的前提下,通过添加额外的“访问者”来定义作用于对象结构中各元素的新操作。它主要解决的是稳定的数据结构和易变的操作耦合问题。访问者模式适用于对象结构相对稳定,而操作易变的场景。它使得增加新操作变得简单,但增加新的元素类较为复杂。在使用访问者模式时,应该权衡其带来的灵活性和可能的复杂性。在对象结构频繁变化的场景下,应考虑其他设计模式。

2024-04-20 07:49:33 173

原创 设计模式:生活中的状态模式

状态模式通过将状态的变化逻辑分散到不同的状态对象中,而非集中在一个大的条件语句里,使得代码更加模块化,易于理解和维护。这种模式非常适用于对象的行为依赖于其状态的场景,如咖啡机示例所示,它帮助我们清晰地模拟和管理了咖啡机在不同状态下的行为。

2024-04-16 13:18:28 361

原创 设计模式:状态模式示例

这两个示例展示了状态模式在不同场景下的应用。在第一个示例中,交通信号灯根据当前状态变化到下一个状态;在第二个示例中,游戏角色根据等级状态拥有不同的行为。状态模式使得状态的变化更加灵活和可管理,同时也使得代码更加清晰和易于维护。交通信号灯(红灯、绿灯、黄灯)根据当前状态切换到下一个状态。游戏中的角色根据经验值提升等级,不同等级有不同的行为。

2024-04-16 09:00:00 160

原创 设计模式:状态模式

状态模式(State Pattern)允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。简而言之,状态模式通过将状态封装成独立的类,并将行为委托到当前状态的对象,来实现对象在不同状态下的不同行为。状态模式是一种对象行为模式,适用于对象的行为取决于其状态的场景,并且可以动态地在运行时根据状态改变其行为。它有助于组织和管理复杂对象的状态转换,以及相关行为的实现。何时使用:当你的对象有多种状态,这些状态下的行为有明显区别,且状态转换复杂时,考虑使用状态模式。建议。

2024-04-16 08:00:00 629

原创 设计模式:备忘录模式示例

备忘录模式示例

2024-04-14 21:14:08 363

原创 设计模式:备忘录模式

备忘录模式(Memento Pattern)是一种行为设计模式,它允许在不暴露对象实现细节的前提下,捕获和外部化对象的内部状态,以便在将来某个时刻可以将该对象恢复到此状态。备忘录模式使用三个类类型来实现:发起人(Originator)、备忘录(Memento)和看护人(Caretaker)。} }List;备忘录模式是一种非常有用的设计模式,特别适合那些需要恢复到之前状态的场景。

2024-04-14 21:05:55 1219

原创 Hadoop MapReduce解析

Hadoop MapReduce是一个用于处理大量数据的编程模型和一个相应的实现框架。MapReduce作业通常分为两个阶段:Map阶段和Reduce阶段。

2024-04-11 08:19:33 1620

原创 Hadoop、HDFS、Hive、Hbase区别及联系

Hadoop、HDFS、Hive和HBase是大数据生态系统中的关键组件,它们都是由Apache软件基金会管理的开源项目。下面将深入解析它们之间的区别和联系。

2024-04-10 19:35:54 639

原创 java的flatMap和map的区别

flatMap是一个强大的操作,可以用来处理流中的嵌套结构,并将它们扁平化为一个更简单的流。这使得在处理复杂的数据结构时,我们可以更容易地应用各种流操作,如filtermap和collect。

2024-04-10 14:12:33 432

原创 TreeMap和HashMap的区别

选择HashMap还是TreeMap,取决于你的具体需求。如果需要快速的查找和插入,且不关心顺序,则HashMap是一个好的选择。如果你的应用需要有序遍历键或者按范围查询键,TreeMap将是更好的选择。在性能敏感的应用中,了解基础数据结构和操作的时间复杂度对于做出正确的选择至关重要。

2024-04-10 11:18:55 383

原创 设计模式:生活中的命令模式

通过这个类比,我们可以看到命令模式如何将发出请求的客户端与接收和执行请求的代码分离开来。这种分离带来了高度的灵活性和可扩展性,同时使得请求的发出、记录、排队和撤销变得简单。在软件设计中,这种模式允许我们编写更加模块化和可维护的代码。

2024-04-10 10:55:06 420

原创 设计模式:命令模式示例

命令模式在软件开发中有许多应用场景。

2024-04-10 10:44:19 389

原创 设计模式:命令模式

Command:命令接口,声明执行操作的方法。:具体命令,实现命令接口,定义绑定于接收者的动作。Client:客户端,创建一个具体命令对象并设定其接收者。Invoker:请求者,负责调用命令对象执行请求。Receiver:接收者,执行与请求相关的操作。命令模式很有用,特别是在需要撤销操作、操作的排队、日志记录或事务功能时。在设计系统时,如果你预见到需要这些功能,那么采用命令模式是合理的。然而,在决定是否使用命令模式时,应该考虑系统的复杂性和可维护性。

2024-04-10 10:38:40 555

原创 设计模式:生活中的责任链模式

他们可以处理在自己能力范围内的请求,如果处理不了,就把请求传递给下一个处理者。责任链模式的好处是,请求的发送者不需要知道谁是最终处理者,他们只需要等待请求得到处理即可。如果当前处理对象无法处理请求或者认为下一个处理对象更适合处理该请求,它会将请求传递给链中的下一个处理对象。:如果你的请求与食物的特殊制作有关,比如你有特定的食物过敏并需要定制菜单,服务员会将你的需求传递给厨师。:最后,如果你的请求非常特殊,比如你想要在餐厅举办一个惊喜派对并需要特别的安排,这时候可能就需要餐厅经理来决定了。

2024-04-08 14:45:20 348

原创 设计模式:责任链模式示例

责任链模式可以应用于多种场景,下面是几个不同场景的例子,每个例子都包括完整的代码。

2024-04-08 14:31:23 423

原创 设计模式:责任链模式

责任链模式通过定义一个对象链来分配请求的处理,每个对象在处理请求或将请求传递给链中的下一个对象方面都有自己的职责。这种模式背后的关键思想是解耦发送者和接收者。责任链模式是一个强大的模式,可以帮助设计灵活且松耦合的系统。确保链中的顺序是正确的,并且每个处理程序都有机会处理请求。考虑在链的末端添加一个默认处理程序,以确保所有请求都会被处理。当链较长时,监控性能,并在必要时优化链的结构。适当使用责任链模式,不要在不需要多个处理程序的场景中强制使用它。

2024-04-08 11:20:26 1125

原创 设计模式:生活中的迭代器模式

隐藏复杂性:正如你不需要知道菜单是如何打印和组织的,迭代器模式隐藏了聚合对象的内部结构。统一接口:翻阅菜单的方式对所有餐厅都是一样的,迭代器模式提供了一个统一的接口来遍历不同的聚合结构。支持多种遍历:就像不同的菜单可能有不同的遍历方式(比如按菜系分类),迭代器模式也支持多种遍历聚合对象的方法。迭代器模式强调了如何提供一个简单的接口来顺序访问一组对象,同时隐藏底层的数据结构和遍历的具体实现。正确应用迭代器模式可以使得代码更加灵活和可维护。

2024-04-07 11:04:48 466

原创 设计模式:迭代器模式

以上示例展示了迭代器模式在不同数据结构遍历上的应用。迭代器模式的关键优势是它提供了一种统一的接口来遍历各种类型的数据结构,同时对客户端隐藏了数据结构的实现细节。保持迭代器接口简单,通常包含hasNext()和next()方法即可。确保迭代器正确处理底层数据结构的变更。考虑迭代器的线程安全性,特别是在多线程环境中使用共享数据结构时。如果迭代逻辑非常复杂,可以考虑使用访问者模式来进一步分离逻辑和数据结构。迭代器模式是一种强大的工具,可以使代码更加清晰、灵活,并且易于维护。

2024-04-07 10:57:59 836

原创 设计模式:迭代器模式

迭代器模式(Iterator Pattern)是一种行为设计模式,它提供了一种方式来顺序访问一个聚合对象中的各个元素,而又无需暴露该对象的内部表示。迭代器模式是一种常用的设计模式,它提供了一种标准的方法来遍历聚合对象。该模式有助于保持代码的干净和可管理,同时也支持对聚合对象的多种遍历方式。在设计迭代器时,应确保其正确处理聚合对象中的并发修改。避免在迭代器中实现复杂的业务逻辑,迭代器应专注于元素的遍历。当聚合结构简单且不预期变化时,可以考虑是否真的需要迭代器模式。

2024-04-06 19:28:26 781

原创 设计模式:生活中的观察者模式

动态订阅与取消订阅:用户可以随时开始或停止关注,类似于在观察者模式中动态添加和删除观察者。解耦:名人无需知道具体有哪些用户关注他们,只需发布更新即可,这与观察者模式中主题和观察者之间的解耦相对应。广播通知:社交媒体平台负责将更新广播给所有关注者,就像主题在其状态改变时通知所有观察者一样。这个类比有助于我们理解观察者模式在软件设计中的应用,它强调了对象间的动态关系和通信,以及如何将状态的变化通知给一组可能感兴趣的其他对象。

2024-04-06 16:26:48 808 1

原创 设计模式:观察者模式示例

这个天气监测应用的例子展示了观察者模式在实际应用中的使用。该模式允许对象在无需知道其他对象具体实现的情况下相互通信,从而实现了主题和观察者之间的解耦。通过使用观察者模式,我们可以轻松地添加新的观察者,或者在不影响其他观察者的情况下更改主题的状态更新逻辑。

2024-04-06 10:13:22 713

原创 设计模式:观察者模式

观察者模式(Observer Pattern)是一种行为设计模式,允许一个对象(称为“主题”或“可观察对象”)维护一组依赖于它的对象(称为“观察者”),当主题的状态发生变化时,会自动通知所有观察者对象。观察者模式是一种非常有用的模式,用于实现对象之间的非紧密耦合通信。它允许主题在状态变化时通知一个或多个观察者,而无需知道观察者的具体实现。确保正确管理观察者的注册和注销,以避免内存泄露。如果更新操作非常频繁或处理成本高昂,考虑使用异步处理或节流技术。

2024-04-06 10:01:13 760 1

原创 设计模式:生活中的策略模式

策略的多样性:就像出行方式有很多种,策略模式允许在不同的算法间自由切换。上下文的决策:出行规划者(上下文)根据当前的情况选择最合适的出行方式,类似于策略模式中上下文的作用。策略的封装:每种出行方式的具体实现是封装的,主要关注点是到达目的地,这与策略模式中的策略封装相对应。策略的替换:策略模式允许在运行时根据不同情况更换策略,就像你可以根据天气变化选择不同的出行方式一样。策略模式强调了算法的可替换性和上下文在选择策略时的灵活性。

2024-04-06 09:07:43 325

原创 设计模式:策略模式示例

这些示例展示了策略模式在不同场景下的应用。策略模式允许在运行时选择合适的算法或行为,同时也方便未来添加新的策略而不影响现有代码。在需要压缩文件的应用程序中,可以根据文件类型或用户的选择应用不同的压缩策略。在需要对不同类型的数据集进行排序时,可以使用策略模式来选择不同的排序算法。电子商务应用程序中,可以根据用户的支付方式选择不同的支付策略。

2024-04-06 09:01:59 575

原创 设计模式:策略模式

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,将每个算法封装起来,并使它们可以互换使用。策略模式让算法的变化独立于使用算法的客户。策略模式提供了一种灵活的方式来切换算法的行为。在设计系统时,如果遇到多个相关的类只有在行为上有差别,或者希望在运行时能轻易地切换算法,那么策略模式可能是一个不错的选择。仔细设计策略接口,确保它能够覆盖所有具体策略的共同行为。避免策略类之间的重复代码,可能通过继承或组合来重用代码。

2024-04-06 08:20:00 1058

原创 设计模式:生活中的享元模式

共享:图书馆中的书籍被不同的读者共享,就像享元模式中的共享对象一样。内部状态:书籍的内容是不变的,相当于享元对象的内部状态。外部状态:读者阅读书籍的具体环境(时间、地点等)是变化的,相当于享元对象的外部状态。管理:图书馆管理书籍的存储和借阅,就像享元工厂管理享元对象的创建和复用。这个类比有助于我们理解享元模式的核心思想:通过共享和管理内部状态不变的对象,来有效地节约资源和提高效率。在软件设计中,这意味着通过共享相似对象来减少内存占用,同时处理外部状态来满足不同的使用场景。

2024-04-05 19:18:51 264

原创 设计模式:享元模式案例

让我们以游戏开发中的棋类游戏(例如国际象棋)为例来展示享元模式的代码实现。在这个例子中,棋子的类型是内部状态,而棋子的位置是外部状态。

2024-04-05 19:15:01 665

原创 设计模式:享元模式

享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享尽可能多的相似对象来减少内存使用,提高性能。这种模式下,对象的共享可以是细粒度的,这些对象提供了重复使用的可能性。享元模式是一种用于优化性能和内存使用的设计模式。当面对大量细粒度对象的系统时,它尤其有用。仔细区分对象的内部状态和外部状态,确保内部状态是共享的,而外部状态是外部传入的。使用工厂模式管理共享对象,确保正确地创建和复用享元对象。在多线程环境中注意线程安全问题,避免共享对象状态被意外修改。

2024-04-05 18:46:46 704

原创 设计模式:生活中的组合模式

通过这个日常生活中的类比,我们可以看到组合模式如何在软件设计中发挥作用。它允许我们以统一的方式操作单个对象和组合对象,简化了客户端代码,并使得整个结构更加灵活。在设计系统时,考虑到部分-整体的关系,可以帮助我们更好地应用组合模式。

2024-04-05 13:28:36 1000

原创 设计模式:组合模式示例

在图形用户界面(GUI)中,容器组件可以包含其他容器组件或者叶子组件(如按钮、文本框等)。无论是容器还是叶子组件,都可以对它们执行某些操作,如绘制、启用/禁用等。在文件系统中,目录可以包含文件或者其他目录,但是从用户的角度来看,目录和文件都可以被“打开”或者“获取大小”。在这些例子中,组合模式允许客户端以统一的方式操作单个对象和组合对象,这样的设计简化了客户端代码,并使得整个结构更加灵活。在组织结构中,公司可以分为部门,部门下可以有子部门或员工。部门和员工都可以执行某些操作,如获取成本。

2024-04-05 13:22:22 595

原创 设计模式:组合模式

组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以统一对待单个对象和组合对象。组合模式是一种强大的设计模式,可以有效地表示对象的部分-整体层次结构,并简化客户端代码。维护清晰的组件接口,并尽可能使接口通用,以便客户端代码可以统一对待叶节点和组合对象。仔细设计组件间的关系,特别是在设计组合对象管理子部件的方式时。考虑引入抽象类或接口来定义组件的公共接口。

2024-04-05 13:16:02 806

原创 设计模式:桥接模式

桥接模式(Bridge Pattern)是一种结构型设计模式,它将抽象与实现分离,使它们可以独立地变化。在桥接模式中,抽象部分(Abstraction)包含对实现部分(Implementor)的引用,实现部分可以通过接口中的方法被抽象部分使用,但是具体的实现细节对于抽象部分来说是隐藏的。桥接模式是一种有用的设计模式,它通过分离抽象和实现,增加了系统的灵活性。在设计时考虑系统中哪些维度可能变化,并将它们分离成不同的结构。不要过早地引入桥接模式,仅当确实有多个维度变化时才考虑使用。

2024-04-05 13:01:42 621

原创 设计模式:外观模式

外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个统一的接口来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。外观模式是一种常用的设计模式,它可以简化复杂系统的使用,使得客户端代码更加简洁易懂。保持外观接口的简单性和高层抽象,不要暴露子系统的细节。避免在外观类中添加过多的业务逻辑,应该将逻辑放在合适的子系统中。当子系统变得复杂时,考虑引入更多的外观,而不是不断扩展现有的外观。外观模式可以有效地帮助开发者降低系统的复杂度,提高可用性。

2024-04-05 09:17:21 868

原创 设计模式:代理模式

代理模式(Proxy Pattern)是一种结构型设计模式,它为另一个对象提供一个代理或占位符,以控制对这个对象的访问。使用代理模式可以在不改变对象本身的前提下,增加额外的功能,如访问控制、延迟初始化、日志记录、安全检查等。代理模式是一种非常有用的设计模式,它可以在不改变被代理对象的前提下,为系统提供灵活的访问控制和其他辅助功能。根据实际需求选择合适的代理类型。明确代理的职责,避免一个代理类做太多事情。注意性能和复杂性的权衡,不要过度使用代理模式。

2024-04-04 20:17:14 736

原创 LeetCode 热题 100:03 最长连续序列

最长连续序列」是一道经典的哈希表应用题目,主要考察对哈希表操作以及复杂度分析的能力。这道题的关键在于理解如何利用哈希表的 O(1) 时间复杂度特性来快速检查元素的存在性。对于希望提升算法水平的开发者来说,这道题目是一个很好的练习,因为它要求在保证时间复杂度的情况下,找到一种有效的方法解决问题。在实际应用中,了解如何处理和优化连续性问题也是非常有用的。

2024-04-04 18:53:50 437

原创 LeetCode 热题 100:02 字母异位词分组

字母异位词分组」是一道中等难度的题目,主要考察对哈希表的应用以及字符串处理的能力。建议首先掌握基础的字符串排序方法来解决问题,然后尝试更高效的计数方法。在编写代码时,注意字符串和字符数组之间的转换,以及哈希表的高效使用。对于想要提升算法能力的开发者,理解不同解法之间的时间和空间复杂度差异是非常重要的。

2024-04-04 18:22:30 574 2

Introduction+to+Algorithms.pdf

《Introduction to Algorithms》译作《算法导论》,最为经典的算法入门书之一。得到吴军老师推荐。

2019-07-29

空空如也

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

TA关注的人

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