![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
文章平均质量分 79
Bonjour~Bridge
踏踏实实做基础的技术学习
展开
-
23种设计模式:15单例模式(Singleton )
好的设计是性能的关键,能带来程序“质”的优化,这里并不教大家各种代理模型,而是直接介绍代理模式在性能优化的优缺点单例模式将频繁使用的类,特别是创建需要发费大量时间或者内存的类,设置为单例模式,可以提高运行速度、同时可以减少GC压力普通的单例模式我们先看普通的单例模式,在一步步升级public class Singleton { private Singleton() { //创...原创 2020-05-06 10:50:46 · 200 阅读 · 0 评论 -
模式性能优化:上下性能差异大?生产者-消费者模式帮你解决
应用场景?这个模式,我在做服务器的时候没有遇到过,但是应用场景很简单,当上下调用的时候出现很大的性能差异的时候,可以使用这个模式解决,性能差的那方多放几放几个线程,中间用一个队列连接2方的信息传输与缓冲,这样听起来是不是感觉科学计算中是不是很有应用场景呢?角色模拟PCData:模拟消息Producter:生产者,创建消息的类,不断的创建消息到管道中Consumer:消费者,不断的重管道中提取消息,并处理Main:创建生成者和消费者,并利用线程池运行他们,打印他们的运行过程代码PCDat原创 2020-05-10 17:34:34 · 204 阅读 · 0 评论 -
秒杀数据会导致服务器奔溃,你可以借鉴Guarded Suspension模式
有时候我们需要避免突然出现太多的请求而导致服务器奔溃,但同时又需要保证用户的请求不丢失,在这里我们可以借鉴一下Guarded Suspension模式原理Guarded Suspension模式原理很简单,当大量访问同时进来时,我们需要将这些请求缓存起来,然后让服务器逐步消化,同时为了保证用户端有反馈,以至于不断的重刷加重服务器的负载,我们可以借鉴Future模式模拟角色ClientThread:客户端访问模拟ServerThread:服务器处理模拟RequestQueue:发送的消息类代原创 2020-05-10 10:17:30 · 187 阅读 · 0 评论 -
多线程下的“高性能类” - “不变模式”
我们知道String的不变性,让它可以在多线程状态下发挥高性能的优势,那我们是否可以将一个类设置为不变属性,让它也可以在多线程下发挥高性能呢?当然可以前提条件只有当这个类满足以下前提,才能设置为不变模式当对象创建后,其内部状态和数据不能发生任何变化数据需要被多线程共享、频繁访问设置方法不能有修改自身属性的方法,比如setter将所有属性设置为私有,并且用final标记将类设置为final,确保子类不能继承有一个可以创建完整对象的构造函数例子public final class原创 2020-05-10 08:41:13 · 156 阅读 · 0 评论 -
多人干活效率更高 - (Master - worker 模式)
核心思想Master - worker 核心思想其实很简单,就是我有一堆活,我请了一个主管,主管将它分给几个人干,并且不影响我,我还可以去干其他的事情。主管就是这个master,其他人就是worker场景复现我现在有一个任务希望计算1,2,3,……100的立方和于是我请了一个主管,然后又请了5个工人,主管将任务分成了100份,每份任务是计算一个数的立方(算一个任务),每个任务交给一个工人干工人计算完一个任务后交给主管,然后主管又给他分配下一个任务同时主管跑我这里来报告已经计算完的数的结果原创 2020-05-09 16:02:30 · 352 阅读 · 1 评论 -
加载数据太慢?无阻塞异步获取数据之Future模式
思想和应用场景如果获取真实数据比较慢,我们可以先用假数据替代,然后用异步的方式获取真数据,等获取到真实数据的时候,才用真实数据替代假数据。这个在以前网络比较慢的时候,我们用Android手机看带有图片的新闻时体验特别明显,我们打开新闻后,文字很快的出现在我们面前,但是图片确显示了一张“加载中……”的假图片,这个时候,后台会开启很多新的线程,去分别获取真实的图片,当真实的图片获取后,就异步的替换“加载中……”的假“”图片步骤客户端请求数据服务器接收请求,并针对加载耗时的数据(比如图片),马上返回一原创 2020-05-09 10:57:34 · 359 阅读 · 0 评论 -
监测数据变化,提高性能可以尝试“观察者模式”
业务场景我们时常需要知道一些状态的变化,然后做相应的改变,比如“Android”手机中,监测到WIFI断开连接了,目前正在使用流量,做视频的APP,就需要提醒用户是否继续观看,如果我们单独启动一个“线程”来不断监测Wifi是否断开,性能将无比差,因为我们需要监测得实在是太多了,Android中,当WIFI状态发生变化,就通知各个APP(需要被通知的)WIFI状态发生变化,各个APP就会做对应的改...原创 2020-05-06 18:16:44 · 219 阅读 · 0 评论 -
JAVA性能调优 - 装饰着模式也可以优化程序性能
业务场景当我们需要将一段文字发布到网页上进行显示时,我们需要对网页进行HMTL格式化,然后加上HTTP头部等一系列的操作,如果突然有一天,我们需要修改HMTL格式时候,就……OK,其实我们完全可以使用装饰模式,将上面繁琐的方式一步步分解,方便后期维护首先我们使用PacketBodyCreator来收集网页内容其次我们使用PacketHTMLHeaderCreator来讲内容格式化为HTM...原创 2020-05-06 17:10:39 · 141 阅读 · 0 评论 -
23种设计模式:23享元模式(Flyweight)
通过共享同一个对象的拷贝,减少对象创建时间和节省内存的使用,从而提高系统性能场景假设学校5年级有2个班A、B班,A班和B班分布有100个人,这个时候A、B要分别发布春游计划给同学看,A、B班级的春游计划是不一样的,所以A班同学只看A班的春游计划,而春游计划放在数据库中,我们防止A班同学每次看春游计划的时候都查询并生成一个春游计划,所以我们在A班第一个同学查看春游计划后,就将计划存入内存中,方便...原创 2020-05-06 12:33:40 · 201 阅读 · 0 评论 -
JAVA性能调优 - 利用代理模式优化程序性能
好的设计是性能的关键,能带来程序“质”的优化,这里并不教大家各种代理模型,而是直接介绍代理模式在性能优化的优缺点代理模式对真实对象进行延迟加载,从而提高系统启动速度,有点类似360优化我们开机时间的感觉静态代理分别有下面4个类:IDBQuery:代理的接口DBQuery:真实的类,这里模仿加载速度特别慢的类,为了加快系统启动时间,系统启动并不加载它DBQueryProxy:这个是代...原创 2020-05-06 11:11:01 · 229 阅读 · 0 评论 -
23种设计模式:21访问者模式(Visitor)
概念访问者模式:表示一个作用于某个对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作介绍访问者模式的概念非常不容易理解,用通俗的话说,我希望在满足“开放-封闭原则”的条件下,能改变元素的操作。访问者模式本来就很复杂,再加上使用上还有条件,所有实际工作中也很少能用到,下面我们直接看例子吧。我们需要设计一个程序,满足下面要求:程序能反应“男人”、“女人”在不同的状态下的不同反应。状态分为:成功、失败、恋爱。状态可能在后期会有新增,新增状态不会影响原先的代原创 2020-11-03 23:17:54 · 107 阅读 · 0 评论 -
23种设计模式:20解释器模式(Interpreter)
介绍解释器模式和字面意思一样,作用主要是为了解释某些特别的字符,比如Java语言的,字节码解释成机器码的过程,但今天不可能举这么复杂的例子,那么我参考了大话设计模式中的例子,并简化了其中某些我认为不必要的“语法”。例子如下:我希望将“CDEFGAB”替代“1234567”的音符(也就是Do-Re-Mi-Fa-So-La-Ti)将“1 2 3” 替代 “低音 中音 高音”于是替代后的一串字符如下:2 E G A E G D E G A 3 C 2 A G C E D(输入)那么原来的字符为:原创 2020-11-03 00:10:50 · 100 阅读 · 0 评论 -
23种设计模式:19中介者模式(Mediator)
用一个中介者对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互介绍中介,大家多半想到出租房子吧!好吧!今天就以出租房子作为例子!房东:中介,我想出租我的房子,每月1800元。中介:好的。租客:中介,我想租房子,2000以内的。中介:好的,我正好有一套。上面的房屋出租过程,租客和房东完全不需要相互交流就可以将业务完成,也就是租客和房东之间解耦合了。下面我们看看UML图吧!UML图代码...原创 2020-11-02 00:36:00 · 162 阅读 · 2 评论 -
23种设计模式:18责任链模式(Chain of Responsibility)
介绍今天介绍责任链模式,举个小美相亲的例子,假如小美想相亲,就叫大姑、舅舅、姐姐去帮她依次把关。他的3个亲人对相亲的小伙子有如下要求:大姑:小伙子一定要能挣钱,工资必须高于5000,否则不行。舅舅:小伙子不能太瘦,体重要超过110,否则保护不了小美。姐姐:小伙一定要超过160,矮了不行。小美:只要是男的就行。上面的大姑、舅舅、姐姐三人组成了一个责任链,他们的责任是按照自己的要求帮小美把关,下面我画以下它的UML图UML图责任链关键一点是,自己依赖自己的接口。而最后一个判断者必须处理完业原创 2020-10-29 23:47:31 · 135 阅读 · 0 评论 -
23种设计模式:17命令模式(Command)
介绍今天我们用汽车去4S点保养作为例子,4S店提供如下服务:洗车、换机油、加气。所以我们需要的角色有下面4个:客户:这里就是发送命令的主程序main方法命令:也就是上面的洗车、换机油、加气服务前台:负责收集客户的命令(服务),然后告诉修理工修理工:执行前台传递过来的服务从上面可以看出,命令类连接客户、前台、修理工的。而命令的种类很有可能随着业务的增加而发生变化。客户和修理工不会直接发生关系,所以UML图如下:UML图代码业务为张三最开始希望进行洗车、换机油、加气3个服务,但是突然有原创 2020-10-28 00:14:08 · 106 阅读 · 0 评论 -
23种设计模式:16桥接模式(Bridge)
介绍哈哈,Bridge和我的昵称差不多!桥接模式其实很简单的,网上很多学习资料大概是为了介绍合成/聚合复用原则或者是为了说清楚桥接模式的好处,都会先用一个特别复杂的错误案例,然后将学习的同学脑袋弄晕,然后才开始介绍桥接模式。那么,今天我就直接说举例说桥接模式,然后再举错误的例子,最后介绍合成/聚合原则案例分析假设我们希望分别从“用途”和“品牌”2个方面去创建汽车,比如:用途(Purpose): 家用、赛道、商务……品牌(Brand):特斯拉、宝马、BYD……如果是桥接模式,创建方式如原创 2020-10-27 00:05:02 · 88 阅读 · 0 评论 -
23种设计模式:14迭代器模式
介绍迭代器模式非常的常用,以至于我们的JDK直接将迭代器封装到JDK中,比如Iterator类。所以在开发中,我们很少自己写迭代器,而是用JDk封装好的迭代器,下面我们就简单模拟一下迭代器。UMLMyList:相当于我们平时用的List接口,但这里为了方便理解,只写了和迭代器相关的。MyArrayList:相当于我们平时用的ArrayListIterator:这个是迭代器的接口MyItr:这里是真实的迭代器代码先看集合吧!public abstract class MyList原创 2020-10-25 22:22:40 · 73 阅读 · 0 评论 -
23种设计模式:13组合模式
介绍组合模式非常简单,其实就是一个树状结构的组织或者模型,我们可以看看下面的总公司和分公司的组织架构。其中有总公司,总公司下面有各种部门和分公司分公司下面也有相应的部门组合模式就是为了描述这种部门关系而存在的,UML非常简单,不利于理解,大家可以直接看代码吧!UML代码Component:接口,代表一种组织架构部public interface Component { void add(Component component); void del(Componen原创 2020-10-25 11:24:55 · 174 阅读 · 0 评论 -
23种设计模式:12备忘录模式
介绍备忘录模式场景很常见,今天我们就来简单模拟,word文档记录文字后,每次备份,然后恢复备份是怎么实现的。首先,我们需要3个角色,分布是文档本身、备份、保存备份的容器文本本身:它具有添加内容、生成备份文件、还原备份文件3个功能备份文件:它能存储文档中关键的细节。保存备份的容器:它存储的各个时间段的备份文件,方便随时存取。UML图代码Document:这个是模拟的word文档 package com.bridge.memento; public class原创 2020-10-24 20:58:01 · 105 阅读 · 0 评论 -
23种设计模式:11适配器模式
介绍适配器模式非常简单,他常用于新系统对接老系统或者多个第三方系统的接口。所以,一般在新开发的系统中,是很少使用适配器模式。下面我模拟一下,新系统对接2个第三方系统的场景。需要注意下面的不同:系统01的connect方法的端口port需要的是String类型。系统02的连接和断开方法,使用的是open()和close()。为了让系统和系统01、系统02都能对接上,我们此时需要使用适配器模式。UML图代码老系统系统01public class DeviceAdapter01 im原创 2020-10-23 00:29:57 · 110 阅读 · 0 评论 -
23种设计模式:10状态模式
介绍状态模式中主要有2个类,分别是Work和State,今天我们利用工作的状态来理解状态模式,比如,我们在工作的时候,根据时间的不同,有以下几种状态。12点之前:精神百倍12 - 13点:饿了,午饭:犯困,午休13 - 17点:下午状态还不错,继续努力17 - 21点:可能加班,也可能被强制回家21点之后:不行了,睡着了。上面的场景,我们可以看出,我们的工作状态和时间有关(或者被强制回家)。所以,我们希望设计一个State类,这个State类代表工作中的时间状态,同时,它可以根据不同的时间原创 2020-10-21 17:17:04 · 174 阅读 · 0 评论 -
23种设计模式:09观察者模式入门
21号完成原创 2020-10-21 10:57:24 · 240 阅读 · 0 评论 -
23种设计模式:22建造者Bulider模式(生成器模式)
今天完成原创 2020-10-20 23:27:12 · 93 阅读 · 0 评论 -
23种设计模式:08外观模式(Facade)
案列模拟我们现在来模拟一下买股票的情形:第一天:买股票1、买股票2、买股票3、买股票4、买股票5……第二天:.抛出股票2、股票3,买过票17、股票28,计算自己所得第三天:分析股票走势………………你是否发现,这样的话,你每天的时间都买股票、抛股票、计算、分析去了…………那么是否有更容易的方式呢?当然就是基金了。虽然基金要收取手续费,但是他帮你节省了很多事情,而你需要做的只需购买基金或赎回,其他股票的分析,买入,抛出都交给基金去管理了这里提到的通过买基金的方式替代股票,就是外观模式了外观模式原创 2020-10-13 22:32:11 · 87 阅读 · 0 评论 -
23种设计模式:07原型模式
今天完成…………原创 2020-10-13 00:07:50 · 75 阅读 · 0 评论 -
23种设计模式:06模板方法模式
今天完成原创 2020-10-12 22:31:24 · 60 阅读 · 0 评论 -
23种设计模式:05工厂模式与抽象工厂模式
要说工厂模式,我们先回忆一下之前的简单工厂模式,简单工厂模式的UML图如下:简单工厂模式的缺点简单工厂模式缺点在于,工厂方法OperationFatory中,如果此时我需要加一个求余数的工具类,我需要修改OperationFatory方法,这违反了开放-封闭原则工厂模式的解决方案工厂模式为了解决这个问题,可谓煞费苦心啊,我们先来看看工厂模式的UML图吧!总结工厂模式为了解决这个问题,我们需要创建更多的类,且代码的复杂度也增加了,那么其实我们有更好的解决方案,即抽象工厂模式抽象工厂模式解决方案原创 2020-10-12 21:58:52 · 67 阅读 · 0 评论 -
23种设计模式:04代理模式与动态代理模式
代理模式代理模式思想非常简单,为其他对象提供一种代理以控制对这个对象的访问。下面我举一个漫威中的英雄“钢铁侠”的例子,在战斗中钢铁侠的外盔甲帮托尼打架。UML图代码接口,我这里举例的是漫威公司interface Marvel{ void fly(); void guard(); void shooting();}托尼,本来是平凡人,因为继承了漫威的接口,然后有了钢铁外壳,称为了钢铁侠class Musk implements Marvel{ @原创 2020-09-28 23:33:02 · 81 阅读 · 0 评论 -
23种设计模式:03装饰模式
最近写这些博客的目的也是帮自己梳理一下之前学习的知识,并希望的到新的感悟,放入博客之中,最近的感悟是,我们需要重点理解设计模的几个原则,然后各个模式是用于解决不同的场景的需求,而具体场景下,我们不必拘泥于模式的格式是否正确,否则这就违背了模式的初衷,我们应该将能独立的分析自己的需求和要达到的目的,然后可以借鉴各个模式的解决方案应用场景对实体类“人”的职能的“任意”扩展当我们希望对人的职能进行扩展,而具体的扩展的功能我们希望再不同的需求场景下是可以装配的,而不是一层不变的,比如“张三”可以开车、穿西.原创 2020-09-24 00:04:36 · 126 阅读 · 0 评论 -
23种设计模式:00七大原则和相关概念的理解
下面是我对设计的7个原则的个人理解,如有不妥之处,欢迎大家指出:23种设计模式,其实都是在下面7大原则的基础上,设计出来适合目前大部分实际开发中所遇到的问题的方案单一原则每个类只应该拥有一个一个职能,也就是说,当需求改变时,修改一个类只会因为一个原因如果一个类有多个职能,当其中一个职能被修改时,很可能会影响这个类的其他职责这样的设计是脆弱的,极容易发生问题,如果如果发现一个类有个职责,我们应该考虑去拆分它了里氏替换原则一个软件实体(类、模块、函数等等),子类可以替换父类,如果我们将子原创 2020-09-22 23:00:24 · 113 阅读 · 1 评论 -
23种设计模式:02策略模式(个人改进意见)
这篇博客并不是介绍策略模式的,网上对策略模式介绍已经很多了,具体的UML图,如下 图中,不带X的,就是原版的策略模式,下面是个人的改进意见,有不同意见的欢迎讨论,轻喷……策略模式的缺点Client与Context和Sale都有关联,导致Client和具体的策略方法都耦合在一起策略的创建方法都放在Client客户端,如果策略过多,势必加大了客户端业务员的复杂性策略过多的暴露出来,也不利于策略的维护package com.design;import java.util.HashMap;.原创 2020-09-22 22:24:28 · 282 阅读 · 0 评论 -
23种设计模式:01简单工厂模式
平时画UML图不太规范,如果有错误,欢迎大家指出目标用面向对象语言实现一个计算机控制台程序,要求输入两个数和运算符号,得到结果思想Operation接口,下面有4个具体的实现类(加减乘除),应该满足“单一职责原则”业务类通过Fatory调用Operatin的类,是为了满足“迪米特法则”,将业务(Main方法中)和计算方法(Operation接口)解耦合UML图代码Operation及其子类package design.fatory;public interface Ope原创 2020-09-21 23:31:56 · 73 阅读 · 0 评论