- 博客(29)
- 收藏
- 关注
原创 23种设计模式的JAVA实现——访问者模式(行为型模式)
访问者模式 访问者模式:在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。 **意图:**主要将数据结构与数据操作分离。 **主要解决:**稳定的数据结构和易变的操作耦合问题。 **何时使用:**需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,
2021-08-12 18:35:45
233
原创 23种设计模式的JAVA实现——命令模式(行为型模式)
命令模式 命令模式:命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 **意图:**将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。 **主要解决:**在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。 **何时
2021-08-11 18:57:02
198
原创 23种设计模式的JAVA实现——职责链/责任链模式(行为型模式)
职责链模式:责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。 **意图:**避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。 **主要解决:**职
2021-08-10 20:51:51
201
转载 23种设计模式的JAVA实现——策略模式(行为型模式)
策略模式(Strategy) 策略模式:在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 **意图:**定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 **主要解决:**在有多种算法相似的情况下,使用 if…else 所带来的复杂和难以维护。 **何时使用:**一个系统有许多
2021-08-09 21:09:15
207
原创 23种设计模式的JAVA实现——状态模式(行为型模式)
状态模式(State) 状态模式:在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。 **意图:**允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。 **主要解决:**对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。 **何时使用:**代码中包含大量与对象状态有关的条件语句。 **如何解决:**将各种具
2021-08-02 17:42:32
232
原创 23种设计模式的JAVA实现——观察者模式(行为型模式)
观察者模式 定义:当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知依赖它的对象。观察者模式属于行为型模式。 使用场景: 一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。 一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。 一个对象必须通知其他对象,而并不知道这些对象是谁。 需要在系统中创建一个触发链,A对象的行为
2021-08-01 20:14:53
183
原创 23种设计模式的JAVA实现——代理模式(结构型模式)
代理模式 代理模式:在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 **意图:**为其他对象提供一种代理以控制对这个对象的访问。 **主要解决:**在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象
2021-07-29 18:54:55
152
转载 23种设计模式的JAVA实现——模板方法模式(行为型模式)
模板方法模式 模板方法模式:在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。 **意图:**定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 **主要解决:**一些方法通用,却在每一个子类都重新写了这一方法。 **何时使用:**有一些通用的方法。 **如何解决:**将这些通用算法抽象出
2021-07-28 22:01:23
166
原创 23种设计模式的JAVA实现——享元模式(结构型模式)
享元模式 享元模式:享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式。 享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。我们将通过创建 5 个对象来画出 20 个分布于不同位置的圆来演示这种模式。由于只有 5 种可用的颜色,所以 color 属性被用来检查现有的 Circle 对象。 **意图:**运用共享技术有效地支持大量细粒度的对象。 **主要解决
2021-07-27 19:24:53
234
原创 23种设计模式的JAVA实现——组合模式(结构型模式)
组合模式 组合模式:组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。 **意图:**将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 **主要解决:**它在我们树型结构的问题中,模糊了简单元素和复杂元素的概
2021-07-26 21:33:21
262
原创 23种设计模式的JAVA实现——桥接模式(结构型模式)
桥接模式 桥接模式:桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。这种模式涉及到一个作为桥接的接口,使得实体类的功能 独立于接口实现类。这两种类型的类可被结构化改变而互不影响。 优点: 1、抽象和实现的分离。 2、优秀的扩展能力。 3、实现细节对客户透明。 **缺点:**桥接模式的引入会增加系统的理解与设计难度,由于聚合关联关系建立在抽象层,要求开发者针对抽象进行设计与编程。 使用场景: 如
2021-07-25 21:47:30
169
原创 23种设计模式的JAVA实现——装饰模式(结构型模式)
装饰模式 装饰模式:允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。 优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。 缺点:多层装饰比较复杂。 使用场景: 扩展一个类的功能
2021-07-24 21:31:58
168
原创 23种设计模式的JAVA实现——适配器模式(结构型模式)
适配器模式 定义:适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。这种类型的设计模式属于结构型模式,它结合了两个独立接口的功能。 这种模式涉及到一个单一的类,该类负责加入独立的或不兼容的接口功能。举个真实的例子,读卡器是作为内存卡和笔记本之间的适配器。您将内存卡插入读卡器,再将读卡器插入笔记本,这样就可以通过笔记本来读取内存卡。 我们通过下面的实例来演示适配器模式的使用。其中,音频播放器设备只能播放 mp3 文件,通过使用一个更高级的音频播放器来播放 vlc 和 mp4 文件。
2021-07-22 19:42:06
170
原创 Mybatis开发遇到的问题——sql语句正确查不到数据
sql语句正确查不到数据 这几天在开发一个网页的时候发现查询功能无论怎样都查询不到数据,但部分接口却能使用,找了好几个小时,最终发现是中文字符的问题,在这里写一个博客,来记录开发遇到的这个问题 Mybatia sql语句正确查不到数据 解决方案: 在数据源url中增加&characterEncoding=utf-8属性,例如: url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai&useUnicode=tru
2021-07-21 20:37:20
2105
2
原创 23种设计模式的JAVA实现——外观模式(结构型模式)
外观模式/门面模式 定义:外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。 优点: 1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。 **缺点:**不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。 Shape public interface Shape { void draw(); } Circle public class Circle
2021-07-20 20:10:54
182
原创 23种设计模式的JAVA实现——原型模式(创建型模式)
原型模式 原型模式(Prototype):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。 类图: 原型模式主要用于对象的复制,它的核心是就是类图中的原型类Prototype。Prototype类需要具备以下两个条件: 实现Cloneable接口。在java语言有一个Cloneable接口,它的作用只有一个,就是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法。在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedEx
2021-07-19 18:30:02
216
原创 23种设计模式的JAVA实现——创建者模式/生成器模式(创建型模式)
生成器模式 生成器模式(Builder Pattern):也叫建造者模式,它将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 优点 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同的产品对象 。 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方
2021-07-17 21:09:06
184
原创 23种设计模式的JAVA实现——抽象工厂模式(创建型模式)
抽象工厂模式,对工厂方法模式进行抽象。世界各地都有自己的水果园,我们将这些水果园抽象为一个水果园接口,在中国、英国和美国都有水果园,种植不同的水果,比如苹果、香蕉和梨等。这里将苹果进行抽象,所以,苹果又分为中国苹果,英国苹果和美国苹果。中国的水果园中有苹果、香蕉和梨等。抽象工厂中声明生产苹果、香蕉和梨等水果,那么具体的工厂相当于中国、英国和美国的水果园,各个水果园负责生产水果、香蕉和梨等。 Fruit public interface Fruit { /** * 抽象接口 *
2021-07-16 21:49:40
134
原创 23种设计模式的JAVA实现——工厂方法模式(创建型模式)
工厂方法模式 优点 更符合开-闭原则 新增一种产品时,只需要增加相应的具体产品类和相应的工厂子类即可 符合单一职责原则 每个具体工厂类只负责创建对应的产品 不使用静态工厂方法,可以形成基于继承的等级结构 缺点 添加新产品时,除了增加新产品类外,还要提供与之对应的具体工厂类,系统类的个数将成对增加,在一定程度上增加了系统的复杂度;同时,有更多的类需要编译和运行,会给系统带来一些额外的开销; 由于考虑到系统的可扩展性,需要引入抽象层,在客户端代码中均使用抽象层进行定义,增加了系统的抽象性和理解难度,且在实
2021-07-15 21:27:22
149
原创 23种设计模式的JAVA实现——单例模式(创建型模式)
设计模式 设计模式的分类 创建型模式:就是创建对象的模式,抽象了实例化的过程。它帮助一个系统独立于如何创建、组合和表示它的那些对象。关注的是对象的创建,创建型模式将创建对象的过程进行了抽象,也可以理解为将创建对象的过程进行了封装,作为客户程序仅仅需要去使用对象,而不再关系创建对象过程中的逻辑。 社会化的分工越来越细,自然在软件设计方面也是如此,因此对象的创建和对象的使用分开也就成为了必然趋势。因为对象的创建会消耗掉系统的很多资源,所以单独对对象的创建进行研究,从而能够高效地创建对象就是创建型模式要探讨的问题
2021-07-14 19:47:03
133
原创 Ubuntu 中搭建以太坊区块链私有链(一)
1. 序言 在最近的项目开发中,遇到了搭建区块链的问题,这里以以太坊区块链为例,阐述一下区块链私有链的搭建教程。 2. 安装Go 到Go官网下载Go安包,下载地址https://golang.org/dl/ 选取合适的下载版本,这里选go1.16.2.linux-arm64.tar.gz 将文件上传至Ubuntu,并解压 tar -zxvf go1.16.2.linux-arm64.tar.gz 将解压后的文件夹,放到自己平常的安装包位置,并设置0777权限 sudo cp -rf go /us
2021-03-30 21:54:21
1215
2
原创 剑指offer48题
剑指offer48题 题目如下 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3: 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子
2021-03-24 21:21:41
149
原创 剑指offer19题
剑指offer19题相关理解 今天刷算法题刷到了剑指offer的第19题,题目具体如下: 请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。 示例 1: 输入: s = "aa" p = "a" 输出: false 解释: "a" 无法匹配 "aa" 整个字符串 示例 2:
2021-03-22 21:56:18
208
原创 Python中正则表达式的使用
Python中的正则表达式 在日常的开发中,python作为一门十分重要的语言,越来越受人们青睐,在python正则表达式使用也是十分广泛,本篇博客就来详细讲一讲python中的正则表达式,也算复习一遍。 直接上例子,通俗易懂 1. 泛匹配 import re content = 'Hello 123 4567 World_This is a Regex Demo' result = re.match('^Hello.*Demo$', content) print(result) print(result
2021-03-20 21:24:16
185
原创 正则表达式的使用
1. 正则表达式 正则表达式作为常用的字符串匹配工具,在软件开发中经常使用,之前在网络爬虫中和后端代码中经常使用,感觉用处十分广泛,今天来说一说它的用法及其通过python语言和java语言的基本实现。 常见匹配模式 模式 描述 \w 匹配字母数字及下划线 \W 匹配非字母数字下划线 \s 匹配任意空白字符,等价于 \t\n\r\f. \S 匹配任意非空字符 \d 匹配任意数字,等价于 0-9 \D 匹配任意非数字 \A 匹配字符串开始 \Z 匹配字符串结束,如果
2021-03-18 21:57:12
153
原创 区块链的简单实现
区块链的简单实现 最近在学习区块链的相关知识,在懂得原理后通过编程实现了一个简单的区块链程序,希望对以后的学习有所增益,在这里要感谢B站UP主"是落拓呀"的对于区块链的详细讲解,下面附上相关Python代码。 import hashlib import json from typing import Text # 区块 class Block: def __init__(self, data, previousHash): self.__data = data s
2021-03-17 21:42:48
409
原创 Python中常见的类型转换和文件读取
1. Json字符串转换 在平时写Python代码时,尤其是在解析网络爬虫的json数据时,常常会遇到json的类型转换,主要有以下四个方法: json.dumps json.loads json.dump json.load json.dumps # 用于将dict类型的数据转成str json.loads # 用于将str类型的数据转成dict json.dump # 用于将dict类型的数据转成str,并写入到json文件中 json.load # 用于从json文件中读取数据 2. 项目文
2021-03-16 21:34:35
1433
原创 微信公众号网页授权登录
1. 前言 最近在做微信公众号的第三方登录,结合了springboot框架,实现了一个简单的登录验证,在此写一篇博客记录一下。 2. 测试号 2.1 测试号申请 想要做微信公众号开发,就必须具备一个公众号,微信平台公众平台也提供了相关的测试号,访问以下地址: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login 点击登录,微信扫码登录,即可获得自己的测试号啦! 2.2 测试号相关说明 在测试号信息表中,测试号会提供appID和app
2021-01-21 18:23:24
1056
原创 数据结构与算法——排序算法(1)
数据结构与算法——排序算法(1)排序分类1 冒泡排序1.1 基本原理1.2 排序案例1.3 代码实现 排序分类 在数据结构中,排序算法一般可以分为以下几类: 简单排序 1.1 冒泡排序 1.2 选择排序 1.3 插入排序 高级排序 2.1 希尔排序 2.2 归并排序 2.3 快速排序 1 冒泡排序 1.1 基本原理 冒泡排序是一种十分简单的排序算法,其排序原理为: 比较相邻的元素。如果前一个元素比后一个元素大,就交换这两个元素的位置。 对每一对相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素
2020-09-09 13:36:41
136
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅