09-模板方法模式

2022-07-18

09-模板方法模式 模板方法模式 ​ 在面向对象程序设计过程中,程序员常常会遇到这种情况:设计一个系统时知道了算法所需的关键步骤,而且确定了这些步骤的执行顺序,但某些步骤的具体实现还未知,或者说某些步骤的实现与具体的环境相关。 ​ 例如,去银行办理业务一般要经过以下4个流程:取号、排队、办理具体业务、对银行工作人员进行评分等,其中取号、排队和对银行工作人员进行评分的业务对每个客户是一样的,可以在父类中实现,但是办理具体业务却因人而异,它可能是存款、取款或者转账等,可以延迟到子类中实现。 ​ 这样的例子在生活中还有很多,例如,一个人每天会起床、吃饭、做事、睡觉等,其中“做事”的内容每天可能不同。我们把这些规定了流程或格式的实例定义成模板,允许使用者根据自己的需求去更新它,例如,简历模板、论文模板、Word 中模板文件等。 ​ 以下介绍的模板方法模式将解决以上类似的问题。 一. 定义与特点 1. 定义 ​ 定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。 2. 特点 该模式的主要优点如下。 它....

01-原型模式

2022-07-18

01-原型模式 原型模式 ​ 在有些系统中,存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂且耗时耗资源,用原型模式生成对象就很高效,就像孙悟空拔下猴毛轻轻一吹就变出很多孙悟空一样简单。 一. 定义 ​ 用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节 二. 结构与实现 1. 模式的结构 原型模式包含以下主要角色。 抽象原型类:规定了具体原型对象必须实现的接口。 具体原型类:实现抽象原型类的 clone() 方法,它是可被复制的对象。 访问类:使用具体原型类中的 clone() 方法来复制新的对象。 2. 模式的实现 package design_pattern.prototype; /** * @Author: M˚Haonan * @Date: 2019-10-10 10:31 * @Description: 原型模式简单测试 */ class Realizetype implements Cloneable { Rea....

18-迭代器模式

2022-07-18

18-迭代器模式 迭代器模式 ​ 在现实生活以及程序设计中,经常要访问一个聚合对象中的各个元素,如“数据结构”中的链表遍历,通常的做法是将链表的创建和遍历都放在同一个类中,但这种方式不利于程序的扩展,如果要更换遍历方法就必须修改程序源代码,这违背了 “开闭原则”。 ​ 既然将遍历方法封装在聚合类中不可取,那么聚合类中不提供遍历方法,将遍历方法由用户自己实现是否可行呢?答案是同样不可取,因为这种方式会存在两个缺点: 暴露了聚合类的内部表示,使其数据不安全; 增加了客户的负担。 “迭代器模式”能较好地克服以上缺点,它在客户访问类与聚合类之间插入一个迭代器,这分离了聚合对象与其遍历行为,对客户也隐藏了其内部细节,且满足“单一职责原则”和“开闭原则”,如 Java 中的 Collection、List、Set、Map 等都包含了迭代器。 一. 定义和特点 1. 定义 ​ 提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。迭代器模式是一种对象行为型模式。 2. 特点 其主要优点如下。 访问一个聚合对象的内容而无须暴露它的内部表示。 遍历任务交由迭代器完成,这简化了聚....

03-适配器模式

2022-07-18

03-适配器模式 适配器模式 ​ 在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配。例如,讲中文的人同讲英文的人对话时需要一个翻译,用直流电的笔记本电脑接交流电源时需要一个电源适配器,用计算机访问照相机的 SD 内存卡时需要一个读卡器等。 ​ 在软件设计中也可能出现:需要开发的具有某种业务功能的组件在现有的组件库中已经存在,但它们与当前系统的接口规范不兼容,如果重新开发这些组件成本又很高,这时用适配器模式能很好地解决这些问题。 一. 定义与特点 1. 定义 ​ 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。适配器模式分为类结构型模式和对象结构型模式两种,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。 适配器就相当于在一个中转类(适配器类)中同时包含源接口和目标接口的引用(聚合或者实现或者继承),来达到将二者关联起来的作用 在业务中,为了统一规范,并且在扩展时符合开闭原则,用适配器模式会很方便,参考springmvc的设计DispatchSe....

06-外观模式

2022-07-18

06-外观模式 外观模式 在现实生活中,常常存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这时要是有一个综合部门能解决一切手续问题就好了。 软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。 一. 定义和特点 1. 定义 ​ 是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。 2. 特点 外观(Facade)模式是“迪米特法则”的典型应用,它有以下主要优点。 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。 降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,....

01-策略模式

2022-07-18

01-策略模式 策略模式 一. 旧OOP的问题 继承: 对类的局部改动,尤其是对超类的改动,会影响其他部分。即影响具有溢出效应 二. 概念 分别封装行为接口,实现算法族,超类里面放行为接口对象,在子类里具体设定行为对象。 原则就是: ​ 分离变化部分,封装接口,基于接口编程实现各种功能。 此模式让行为算法的变化独立于算法的使用者。

04-桥接模式

2022-07-18

04-桥接模式 桥接模式 ​ 在现实生活中,某些类具有两个或多个维度的变化,如图形既可按形状分,又可按颜色分。如何设计类似于 Photoshop 这样的软件,能画不同形状和不同颜色的图形呢?如果用继承方式,m 种形状和 n 种颜色的图形就有 m×n 种,不但对应的子类很多,而且扩展困难。 ​ 当然,这样的例子还有很多,如不同颜色和字体的文字、不同品牌和功率的汽车、不同性别和职业的男女、支持不同平台和不同文件格式的媒体播放器等。如果用桥接模式就能很好地解决这些问题。 一. 定义和特点 1. 定义 ​ 将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度 ​ 抽象和实现解耦分离 ​ 桥梁模式中的所谓脱耦,就是指在一个软件系统的抽象化和实现化之间使用聚合关系而不是继承关系,从而使两者可以相对独立地变化。这就是桥梁模式的用意。 ​ 抽象化角色就像是一个水杯的手柄,而实现化角色和具体实现化角色就像是水杯的杯身。手柄控制杯身 将具有两个独立变化维度的类的一些普通业务方法和与之关系最密切的维度设计为“抽象层”。 即将比较重要的,关联....

08-组合模式

2022-07-18

08-组合模式 组合模式 ​ 在现实生活中,存在很多“部分-整体”的关系,例如,大学中的部门与学院、总公司中的部门与分公司、学习用品中的书与书包、生活用品中的衣月艮与衣柜以及厨房中的锅碗瓢盆等。 ​ 在软件开发中也是这样,例如,文件系统中的文件与文件夹、窗体程序中的简单控件与容器控件等。对这些简单对象与复合对象的处理,如果用组合模式来实现会很方便。 一. 定义和特点 1. 定义 ​ 有时又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性 2. 特点 组合模式的主要优点有: 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码; 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”; 其主要缺点是: 设计较复杂,客户端需要花更多时间理清类之间的层次关系; 不容易限制容器中的构件; 不容易用继承的方法来增加构件的新功能; 二. 结构和实现 1. 结构 组合模式包含以下主要角色。 抽象构件(Com....

15-单例模式

2022-07-18

15-单例模式 单例模式 一. 创建方式 二. 应用 1. 在jdk中的使用 package design_pattern.singleton.practice; /** * @Author: M˚Haonan * @Date: 2019-10-28 21:58 * @Description: Runtime类就是一个经典的单例模式 */ public class RuntimeTest { public static void main(String[] args) throws Exception{ Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec("ls"); System.out.println("Java虚拟机中的空闲内存量:"+runtime.freeMemory()); System.out.println("Java 虚拟机试图使用的最大内存量:"+ runtime.maxMemory()); System.out.println("返回 Java 虚拟机中的内存总量:"+ ru....

17-访问者模式

2022-07-18

17-访问者模式 访问者模式 ​ 在现实生活中,有些集合对象中存在多种不同的元素,且每种元素也存在多种不同的访问者和处理方式。例如,公园中存在多个景点,也存在多个游客,不同的游客对同一个景点的评价可能不同;医院医生开的处方单中包含多种药元素,査看它的划价员和药房工作人员对它的处理方式也不同,划价员根据处方单上面的药品名和数量进行划价,药房工作人员根据处方单的内容进行抓药。 ​ 这样的例子还有很多,例如,电影或电视剧中的人物角色,不同的观众对他们的评价也不同;还有顾客在商场购物时放在“购物车”中的商品,顾客主要关心所选商品的性价比,而收银员关心的是商品的价格和数量。 ​ 这些被处理的数据元素相对稳定而访问方式多种多样的数据结构,如果用“访问者模式”来处理比较方便。访问者模式能把处理方法从数据结构中分离出来,并可以根据需要增加新的处理方法,且不用修改原来的程序代码与数据结构,这提高了程序的扩展性和灵活性。 一. 定义和特点 1. 定义 ​ 将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种....

05-装饰模式

2022-07-18

05-装饰模式 装饰模式 ​ 在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框等。在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在不改变其结构的情况下,可以动态地扩展其功能。所有这些都可以釆用装饰模式来实现。 一. 定义和特点 1. 定义 ​ 指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式 2. 特点 装饰(Decorator)模式的主要优点有: 采用装饰模式扩展对象的功能比采用继承方式更加灵活。 可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。 其主要缺点是:装饰模式增加了许多子类,如果过度使用会使程序变得很复杂。 二. 结构和实现 ​ 通常情况下,扩展一个类的功能会使用继承方式来实现。但继承具有静态特征,耦合度高,并且随着扩展功能的增多,子类会很膨胀。如果使用组合关系来创建一个包装对象(即装饰对象)来包裹真实对象,并在保持真实对象的类结构不变的前提下,为其提供额外的功能,这就是装饰模式的目标。下面来分析其基本结构和实现方法。 1. 结构 装饰模....

test

2022-07-18

test html public static void main(String[] args) { } asd 不是吧 sad asd public static { test(): } 阿萨德 名称年龄 马皓楠23 st=>start: 开始 op=>operation: My Operation cond=>condition: Yes or No? e=>end st->op->cond cond(yes)->e cond(no)->op &```

robot自动化

2022-07-18

robot自动化 java.awt.Robot是一个自动化操作鼠标键盘的类库,可以实现一些简单的自动化功能 一. 简单使用 1.1 常用api void delay (int ms) 睡眠指定的时间(类似于线程中sleep) void keyPress(int keycode) 按下指定的键 void keyRelease(int keycode) 释放指定的键 void mousePress(int buttons) 按下一个或多个鼠标按键 void mouseRelease(int buttons) 释放一个活多个鼠标按键 void mouseMove(int x,int y) 将鼠标移动到给定的屏幕坐标上 void mouseWheel(int wheelAmt) 滚动鼠标滑轮 1.2 键盘事件 键盘按键使用的是java.awt.event.KeyEvent所指定的事件,例如KeyEvent.VK_S,代表键盘的S 简单操作 对于一些特殊的字符,windows和mac下有所区别 mac command:KeyEvent.VK_META option:keyEvent.VK_....

javafx

2022-07-18

javafx 问题总结[^1] [^1]: # 问题总结 ## 一. m1安装相关 JavaFX for macos macbook m1[^2] ## 二. 打包问题 ### 1. 非模块化项目 1. 首先使用 maven 打包,需要注意 pom.xml 配置如下 ```xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mahaonan</groupId> <artifac....

问题总结

2022-07-18

问题总结 一. m1安装相关 JavaFX for macos macbook m1[^1] 二. 打包问题 1. 非模块化项目 首先使用 maven 打包,需要注意 pom.xml 配置如下 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.mahaonan</groupId> <artifactId>mhn-tools</artifactId> <ve....

01-javaFx初识

2022-07-18

01-javaFx初识 一. 概述 javaFx 通常由以下几部分组成,Stage,Scene,Controls,Layouts 等等 Stage 类似于窗口的概念,一个 Stage 就是一个 Window。一个 javaFx 程序可以打开多个 Stage,例如主程序的 Stage,对话框,提示框等等 一个应用有一个 Primary Stage,也有一些其他的附属窗口 Scene 呈现于 Stage 之上的一层组件。同一时间一个 Stage 只能有一个 Scene。但是可以进行切换,例如切换登陆 Scene,主页面的 Scene 等等。 Scene 类似于舞台的场景,是呈现应用内容的主要组件。其他的 Controls,Layouts 都依附于 Scene 上 Scene Graph 整个依附于 Scene 的 Controls,layouts 等对象图称为 SceneGraph,也就是 Scene 内部的所有内容组件 Nodes 依附于 Scene 的组件被称为节点,分为 Branch 节点和 leaf 节点。Branch 节点可以有子节点,因此也称为父节点,而叶子节....

世界,你好!

2022-07-18

Solo 博客系统已经初始化完毕,可在管理后台 - 工具 - 偏好设定中调整更多细节设置。如果需要导入已有博客文章,请参考文档 Solo 支持 Hexo/Jekyll 数据导入

对了,出于安全考虑请尽快完成如下操作:

  1. 登录链滴社区后,在个人设置 - B3 中更新 B3 Key
  2. 在 Solo 管理后台 - 工具 - 用户管理中也进行同样的 B3 Key 更新

另外,如果你需要开启评论系统,请参考 Solo 集成 Gitalk 评论系统

最后,如果你觉得 Solo 很赞的话,请到项目主页 Watch、Star、Fork 三连 😍