Javascript设计模式 - 《享元模式(结构型)》
概念享元模式(Flyweight Pattern)是一种结构型设计模式,它旨在通过共享对象来最小化内存使用和提高性能
享元模式通常涉及两个核心角色:享元(Flyweight)和享元工厂(Flyweight Factory)
享元(Flyweight)
表示一个可共享的对象,包含了内部状态和外部状态
内部状态是对象共享的部分,它存储在享元对象内部,而外部状态是对象特有的部分,它存储在享元对象外部,并在需要时通过参数传递给享元对象
享元工厂(Flyweight Factory)
用于创建和管理享元对象
享元工厂通常包含一个享元对象的池子(或者缓存),用于存储和复用已创建的享元对象,并在需要时返回给客户端
享元模式的核心思想是通过共享对象来最小化内存使用和提高性能
当有多个相似的对象需要创建时,享元模式可以将其中的一部分共享出来,从而节省内存空间
这种模式的优点在于,可以减少对象的创建数量,提高系统的性能和可扩展性
享元模式适用于以下情况:
当需要创建大量相似对象,并且这些对象之间有一些共同的部分时,可以使用享元模式
当希望减少对象的创建数量,提高系统性能和可扩展性时,享元模式 ...
Javascript设计模式 - 《组合模式(结构型)》
概念组合模式(Composite Pattern)是一种结构型设计模式,它允许将对象组合成树形结构以表示部分-整体的层次结构
组合模式使得客户端可以统一地处理单个对象和对象集合
组合模式通常涉及两个核心角色:组件(Component)和叶子节点(Leaf)
组件(Component)
定义了组合中所有对象共有的接口和行为,并提供了管理子组件的方法
组件可以是抽象类或接口,它可以是叶子节点或容器节点
叶子节点(Leaf)
表示组合中的叶子对象,它没有子组件
叶子节点通常是组合的最小单元,它实现了组件接口的具体行为
组合模式的核心思想是将对象组合成树形结构,并且统一对待单个对象和对象集合
这种模式的优点在于,可以简化客户端和对象之间的交互,客户端不需要区分单个对象和对象集合,而是统一地对待它们
同时,组合模式也提供了一种灵活的方式来组织和管理对象的层次结构
组合模式适用于以下情况:
当希望将对象组合成树形结构,并且统一对待单个对象和对象集合时,可以使用组合模式
当希望客户端可以统一地处理单个对象和对象集合时,组合模式也是一个很好的选择
举个简单的例子,考虑一个文件系统中的 ...
Javascript设计模式 - 《桥接模式(结构型)》
概念桥接模式(Bridge Pattern)是一种结构型设计模式,它用于将抽象部分与它的实现部分分离,使它们可以独立变化
桥接模式通过将继承关系转化为组合关系来实现这一点
在桥接模式中,存在两个独立的继承层次结构:抽象部分(Abstraction)和实现部分(Implementation)
抽象部分定义了高层次的抽象接口,而实现部分则提供了这些接口的具体实现。通过将抽象部分和实现部分分离,可以使它们可以独立地扩展和变化,而不会相互影响
这种模式的核心思想是通过抽象与实现之间的桥梁来连接它们,使得它们可以独立变化
这种分离使得系统更加灵活,能够更好地应对需求变化。
举个简单的例子,考虑一个绘制图形的程序
可以有不同类型的图形(如圆形、矩形等),也可以有不同的绘制方式(如在屏幕上绘制、在打印机上绘制等)
使用桥接模式,可以将图形的类型和绘制方式分离开来,使得可以很容易地添加新的图形类型或绘制方式,而不需要修改已有的代码
实现条件
存在多个维度的变化
桥接模式适用于有多个维度的变化,并且这些变化需要独立地进行扩展
例如,一个类有两个或更多的维度,每个维度都可能变化,而且这些变化不应该相互 ...
Javascript设计模式 - 《外观模式(结构型)》
概念外观模式(Facade Pattern)是一种结构型设计模式,旨在为复杂系统提供一个简单的接口
它通过隐藏系统的复杂性,为客户端提供一个简单的接口,使得客户端与系统的子系统之间的通信和交互更加简单
在外观模式中,一个单一的外观类提供了一个高级接口,它将系统中的一组接口进行了封装,对外只暴露少量的接口,客户端通过这些接口与系统进行交互,而不需要了解系统中具体的子系统之间的关联和细节
举个例子,考虑一个电脑系统,它包含了各种硬件和软件组件,如CPU、内存、硬盘、操作系统等
客户端如果要使用这些组件,可能需要直接与这些组件进行交互,这样会使得客户端代码变得复杂且不易维护
使用外观模式,可以定义一个电脑外观类,封装各个组件的初始化、启动和关闭等操作,客户端只需要与电脑外观类交互,而不需要了解具体的硬件和软件组件
实现条件
系统包含多个子系统
系统由多个复杂的子系统组成,这些子系统可能相互关联,但客户端不需要知道这些细节
需要简化客户端与子系统之间的交互
客户端需要与系统交互,但由于系统复杂性的原因,直接与子系统交互可能会导致代码复杂性增加
需要实现系统的解耦
客户端与系统之间的耦合 ...
Javascript设计模式 - 《代理模式(结构型)》
概念代理模式(Proxy Pattern)是一种结构型设计模式,它允许你创建一个代理对象,用来控制对另一个对象的访问
代理模式通过引入一个代理对象来代替原始对象,实现了对原始对象的间接访问、控制或者增强
代理对象拥有与原始对象相同的接口,使得客户端无需知道代理对象的存在
在代理模式中,存在两个关键角色:真实主题(Real Subject)和代理主题(Proxy Subject)
真实主题是客户端直接访问的对象,而代理主题是客户端通过代理间接访问真实主题的对象
通过代理模式,可以实现多种功能,比如:
远程代理(Remote Proxy)
代理对象可以代表远程的对象,允许客户端通过代理对象访问远程的资源或服务,而无需了解远程对象的具体细节
虚拟代理(Virtual Proxy)
代理对象可以延迟加载真实对象,只有当客户端需要访问真实对象时才进行加载,从而提高系统的性能和资源利用率
保护代理(Protective Proxy)
代理对象可以控制对真实对象的访问权限,限制客户端对真实对象的直接访问,增强系统的安全性
缓存代理(Cache Proxy)
代理对象可以缓存真实对象的结果 ...
Javascript设计模式 - 《装饰器模式(结构型)》
概念装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许动态地给一个对象添加一些额外的职责,而不需要通过继承来实现
装饰器模式通过引入一个装饰器类和具体组件类来实现这一点
在装饰器模式中,通常存在四个核心角色:抽象组件(Component)、具体组件(Concrete Component)、抽象装饰器(Decorator)和具体装饰器(Concrete Decorator)
抽象组件定义了对象的基本行为,具体组件实现了抽象组件的行为,抽象装饰器继承了抽象组件,并持有一个抽象组件的引用,具体装饰器继承了抽象装饰器,并通过调用抽象组件的方法来增加额外的职责
装饰器模式的核心思想是通过组合的方式来动态地给一个对象添加一些额外的职责,而不需要通过继承来修改原有的类结构
这种模式的优点在于,可以在不改变原有对象的情况下,动态地增加新的功能,从而提高了系统的灵活性和可维护性
装饰器模式适用于以下情况:
需要动态地给一个对象添加一些额外的职责,而不希望通过继承来实现
需要在不影响其他对象的情况下,给一个对象添加一些额外的功能
举个简单的例子,考虑一个咖啡店
咖啡店提 ...
Javascript设计模式 - 《适配器模式(结构型)》
概念适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口
适配器模式通过引入一个适配器对象来实现这一点
在适配器模式中,通常存在三个核心角色:目标接口(Target)、适配器(Adapter)和被适配者(Adaptee)
目标接口定义了客户端所期望的接口,适配器类实现了目标接口,并在内部持有一个被适配者对象,通过调用被适配者对象的方法来实现目标接口的方法
适配器模式的核心思想是将一个类的接口转换成另一个接口,使得原本由于接口不兼容而无法一起工作的类可以协同工作
这种模式的优点在于,可以使得原本不兼容的类能够协同工作,同时也可以使得客户端代码与具体实现类解耦,提高系统的灵活性和可维护性
适配器模式适用于以下情况:
需要将一个类的接口转换成另一个客户端所期望的接口
需要复用一些现有的类,但是其接口与系统要求的不兼容
举个简单的例子,考虑一个英文翻译系统
系统中有一个英文翻译器类,但是客户端需要使用一个中文翻译器
这时可以引入一个适配器类,将中文翻译器的接口适配成英文翻译器的接口,使得客户端能够通过适配器类来调用中文 ...
Javascript设计模式 - 《建造者模式(创建型)》
概念建造者模式(Builder Pattern)是一种创建型设计模式,它将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示
建造者模式通过引入一个建造者接口和具体建造者实现类来实现这一点
在建造者模式中,通常存在四个核心角色:产品(Product)、建造者(Builder)、具体建造者(Concrete Builder)和指挥者(Director)
产品是最终要构建的复杂对象,建造者定义了构建产品所需的步骤和方法,具体建造者实现了建造者接口,负责实际构建产品的过程,而指挥者负责指导构建过程的顺序和调用具体建造者的方法来构建产品
建造者模式的核心思想是将一个复杂对象的构建过程分解成多个简单的步骤,然后由具体建造者来逐步构建产品的各个部分,最终组装成完整的产品
这种分离使得同样的构建过程可以创建不同的表示,使得系统更加灵活、可维护和可扩展
建造者模式适用于以下情况:
构建过程需要多个步骤或者需要根据不同的条件来构建不同的产品
需要控制产品的构建过程,以及灵活地组合各个部分
举个简单的例子,考虑一个汽车制造过程
汽车有多个部件(如车轮、发动机、车身等),而不 ...
Javascript设计模式 - 《抽象工厂模式(创建型)》
概念抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一个接口用于创建相关或依赖对象的家族,而不需要指定具体类
抽象工厂模式通过引入抽象工厂接口和具体工厂实现类来实现这一点
在抽象工厂模式中,存在两个关键角色:抽象工厂(Abstract Factory)和具体工厂(Concrete Factory)
抽象工厂定义了创建产品家族的方法,而具体工厂实现了这些方法,用于创建具体的产品对象
每个产品家族都有一组相互关联的产品,而每个具体产品由具体工厂类创建
抽象工厂接口(Abstract Factory Interface)
定义了一组创建产品的抽象方法,客户端通过调用这些抽象方法来创建产品
具体工厂类(Concrete Factory)
实现了抽象工厂接口,负责创建一组相关的产品
抽象产品(Abstract Product)
定义了一组产品的抽象接口或抽象类
具体产品(Concrete Product)
实现了抽象产品接口或抽象类的具体类
抽象工厂模式的核心思想是通过引入抽象工厂来创建产品家族,使得客户端代码可以与具体的产品类解耦, ...
Javascript设计模式 - 《工厂模式(创建型)》
概念工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的接口,但是允许子类决定实例化哪个类
工厂模式通过定义一个创建对象的接口,但将实际的实例化过程推迟到子类中去完成,从而使得一个类在创建对象时不需要关心具体的实现类
在工厂模式中,通常存在一个工厂类(Factory),它负责创建对象的实例
工厂类可以是简单工厂,也可以是工厂方法或抽象工厂的具体实现
工厂模式的核心思想是将对象的创建过程封装起来,使得客户端代码与具体的对象类解耦,从而提高系统的灵活性和可维护性
这种模式的优点在于,可以在不修改现有代码的情况下很容易地添加新的产品类,而且客户端代码与具体产品类解耦,使得系统更加灵活、可维护和可扩展
举个简单的例子,考虑一个文档编辑器
可以有不同类型的文档(如文本文档、图像文档等),而每种类型的文档可能需要不同的创建方式(如文本文档可以直接创建,而图像文档可能需要先加载图片)
使用工厂模式,可以将文档的创建过程封装到工厂类中,根据不同的类型来创建不同的文档对象,从而实现了文档的统一创建管理
实现条件工厂模式适用于一些特定的情况,包括但不限于:
当一 ...
Javascript设计模式 - 《原型模式(创建型)》
概念原型模式(Prototype Pattern)是一种创建型设计模式,它允许通过复制现有对象来创建新对象,而无需通过标准的构造函数来创建
原型模式通过引入一个原型接口和具体原型实现类来实现这一点
在原型模式中,通常存在两个核心角色:原型接口(Prototype)和具体原型类(Concrete Prototype)
原型接口定义了用于复制自身的方法,而具体原型类实现了原型接口,负责实际进行对象的复制操作
原型模式的核心思想是通过复制现有对象来创建新对象,而无需知道具体对象的类型或者构造方法
这种模式的优点在于,可以避免对象的构造过程,提高对象的创建效率,同时也可以减少代码重复
原型模式适用于以下情况:
当一个系统需要创建大量相似对象时,使用原型模式可以提高对象创建的效率
当对象的构造过程比较复杂,或者需要从数据库或者网络中获取对象的数据时,使用原型模式可以避免这些复杂的构造过程
举个简单的例子,考虑一个图形编辑器
用户可以创建不同类型的图形对象(如圆形、矩形等),而每种图形对象可能需要不同的初始化参数(如半径、宽度、高度等)
使用原型模式,可以在图形对象创建时复制已有的图形对 ...
Javascript设计模式 - 《单例模式(创建型)》
概念单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点来访问该实例
单例模式通过将类的构造函数设为私有,防止外部直接创建实例,同时提供一个静态方法或者属性来获取该实例,从而保证在整个应用程序中只有一个实例存在
单例模式的核心思想是确保一个类只有一个实例存在,并提供一个全局访问点来访问该实例
这种模式的优点在于,可以节省系统资源,提高系统性能,同时也可以保证全局访问点的一致性
然而,需要注意的是,单例模式可能会引入全局状态,增加了代码的耦合度,降低了代码的可测试性
因此,在使用单例模式时需要谨慎考虑
举个简单的例子,考虑一个日志记录器
无论在应用程序的任何地方都需要记录日志,而且只需要一个日志记录器实例来处理所有的日志记录任务
使用单例模式,可以确保在整个应用程序中只有一个日志记录器实例存在,从而实现日志记录的统一管理和控制
实现条件
单例类的构造函数必须是私有的,这样才能将类的创建权控制在类的内部,从而使得类的外部不能创建类的实例。
单例类通过一个私有的静态变量来存储其唯一实例。
单例类通过提供一个公开的静态方法, ...
魔改-《控制台输出》
ASCII字符画生成器
根据文字生成字符画
http://patorjk.com/software/taag
http://www.network-science.de/ascii/
根据图片生成字符画
http://www.degraeve.com/img2txt.phphttp://life.chacuo.net/convertphoto2char
根据流程图生成字符画
http://asciiflow.com/
新建Js文件路径:[BlogRoot]\source\js\
然后inject到底部
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283var now1 = new Date();function createtime1() { var grt = new Date("01/01/ ...
魔改-《适配PDF》
安装hexo-pdf插件1npm install hexo-pdf --save
引用格式1234# 1.本地文件:在md文件路径下创建一个同名文件夹,其内放pdf文件名为xxx.pdf的文件{% pdf xxx.pdf %}# 2.在线链接{% pdf https://cdn.jsdelivr.net/gh/Justlovesmile/CDN/pdf/小作文讲义.pdf %}