java设计之道
No_Game_No_Life_
这个作者很懒,什么都没留下…
展开
-
Java设计之道——通过UML理解23种设计模式
文章目录UML类图泛化(generalize)与实现(realize)聚合(aggregation)与组合(composition)关联(association)与依赖(dependency)23种设计模式创建型模式结构型模式行为型模式UML类图从一个示例开始,请看以下这个类图,类之间的关系是我们需要关注的:泛化(generalize)与实现(realize)泛化:SUV扩展和继承小汽车的功能;实现:小汽车实现车这个概念。聚合(aggregation)与组合(composition)聚合:班原创 2020-07-28 10:52:47 · 466 阅读 · 0 评论 -
Java设计模式——享元模式
享元模式当一个软件系统在运行时产生的对象数量太多,将导致运行代价过高,带来系统性能下降等问题。例如在一个文本字符串中存在很多重复的字符,如果每一个字符都用一个单独的对象来表示,将会占用较多的内存空间,那么我们如何去避免系统中出现大量相同或相似的对象,同时又不影响客户端程序通过面向对象的方式对这些对象进行操作?享元模式正为解决这一类问题而诞生。享元模式通过共享技术实现相同或相似对象的重用,在逻辑上...原创 2019-01-04 16:33:51 · 431 阅读 · 0 评论 -
Java设计模式——外观模式
外观模式外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口,看下类图:(我们以一个计算机的启动过程为例)public class CPU { public void startup(){ Syste...原创 2019-01-04 15:28:37 · 671 阅读 · 0 评论 -
Java设计模式——组合模式
组合模式https://www.cnblogs.com/lfxiao/p/6816026.htmlabstract class Component { public abstract void add(Component c); //增加成员 public abstract void remove(Component c); //删除成员 public ab...原创 2019-01-04 16:11:53 · 414 阅读 · 0 评论 -
Java设计模式——桥接模式
桥接模式桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不用动,原因就是JDBC提供统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了。我们来看看关系图:p...原创 2019-01-04 15:49:58 · 423 阅读 · 0 评论 -
Java设计模式——原型模式
原型模式原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。介绍意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。主要解决:在运行期建立和删除原型。何时使用: 1、当一个系统应该独立于它的产品创建,构成和表示时。 2、当要实例化的类是在运行时刻指定时,例如,通过动态装载...原创 2019-01-04 11:40:17 · 439 阅读 · 0 评论 -
Java设计模式——建造者模式
为什么要有建造者模式工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性。建造者模式与工厂模式的区别:工厂模式一般都是创建一个产品,注重的是把这个产品创建出来就行,只要创建出来,不关心这个产品的组成部分。从代码上看,工厂模式就是一个方法,用这个方法就能生产出产品。建造者模式也是创建一个产品,但是不仅要把这个...原创 2019-01-04 11:28:33 · 445 阅读 · 0 评论 -
Java设计模式——访问者模式
访问者模式访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。访问者模式适用于数据结构相对稳定算法又易变化的系统。因为访问者模式使得算法操作增加变得容易。若系统数据结构对象易于变化,经常有新的数据对象增加进来,则不适合使用访问者模式。访问者模式的优点是增加操作很容易,因为增加操作意味着增加新的访问者。访问者模式将有关行为集中到一个访问者对象中,其改变不影响系统数据结构。...原创 2019-01-07 11:16:17 · 528 阅读 · 0 评论 -
Java设计模式——备忘录模式
备忘录模式主要目的是保存一个对象的某个状态,以便在适当的时候恢复对象,个人觉得叫备份模式更形象些,通俗的讲下:假设有原始类A,A中有各种属性,A可以决定需要备份的属性,备忘录类B是用来存储A的一些内部状态,类C呢,就是一个用来存储备忘录的,且只能存储,不能修改等操作。做个图来分析一下:Original类是原始类,里面有需要保存的属性value及创建一个备忘录类,用来保存value值。Meme...原创 2019-01-07 10:58:12 · 2255 阅读 · 3 评论 -
Java设计模式——命令模式
命令模式命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:Invoker是调用者(司令员),Receiver是被调用者(士兵),MyCommand...原创 2019-01-07 10:40:51 · 21153 阅读 · 65 评论 -
Java设计模式——中介者模式
中介者模式也是用来降低类类之间的耦合的,因为如果类类之间有依赖关系的话,不利于功能的拓展和维护,因为只要修改一个对象,其它关联的对象都得进行修改。如果使用中介者模式,只需关心和Mediator类的关系,具体类类之间的关系及调度交给Mediator就行,这有点像spring容器的作用。先看看图:User类统一接口,User1和User2分别是不同的对象,二者之间有关联,如果不采用中介者模式,则需...原创 2019-01-07 11:22:42 · 515 阅读 · 0 评论 -
Java设计模式——责任链模式
责任链模式责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求。但是发出者并不清楚到底最终那个对象会处理该请求,所以,责任链模式可以实现,在隐瞒客户端的情况下,对系统进行动态的调整。先看看关系图:Abstracthandler类提供了get和set方法,方便MyHandle类设置和修改引用对象,MyHandle类是核心,实...原创 2019-01-07 10:07:59 · 1207 阅读 · 0 评论 -
Java设计模式——模板方法模式
模板方法模式解释一下模板方法模式,就是指:一个抽象类中,有一个主方法,再定义1…n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用,先看个关系图:就是在AbstractCalculator类中定义一个主方法calculate,calculate()调用spilt()等,Plus和Minus分别继承AbstractCalcula...原创 2019-01-04 17:13:44 · 606 阅读 · 0 评论 -
Java设计模式——工厂模式
为什么用工厂模式优势1: 一般在代码中,实例化一个类A是直接new A(),假如类A是一个完全独立的类,没有相似类,则没有必要使用工厂模式,直接new A()没有毛病。但是如果类A本身有一个相似类B,而在实际使用类A或者类B的实例时,如果关心的是类A与类B的共同部分,则工厂模式就可以体现出它的优势。优势2: 初始化封装。在需求一个类的实例时,假如需要一个相同属性的实例,每次初始化的操作是一样的...原创 2019-01-03 17:27:59 · 568 阅读 · 0 评论 -
Java设计模式——迭代器模式
迭代子模式顾名思义,迭代器模式就是顺序访问聚集中的对象,一般来说,集合中非常常见,如果对集合类比较熟悉的话,理解本模式会十分轻松。这句话包含两层意思:一是需要遍历的对象,即聚集对象,二是迭代器对象,用于对聚集对象进行遍历访问。我们看下关系图:这个思路和我们常用的一模一样,MyCollection中定义了集合的一些操作,MyIterator中定义了一系列迭代操作,且持有Collection实例...原创 2019-01-07 09:56:18 · 539 阅读 · 0 评论 -
Java设计模式——状态模式
状态模式核心思想就是:当对象的状态改变时,同时改变其行为,很好理解!就拿QQ来说,有几种状态,在线、隐身、忙碌等,每个状态对应不同的操作,而且你的好友也能看到你的状态,所以,状态模式就两点:1、可以通过改变状态来获得不同的行为。2、你的好友能同时看到你的变化。看图:State类是个状态类,Context类可以实现切换,我们来看看代码:public class Context { ...原创 2019-01-07 11:04:52 · 1481 阅读 · 1 评论 -
Java设计模式——策略模式
行为型模式第三种设计模式——行为型模式,共11种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。策略模式在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 con...原创 2019-01-04 17:13:57 · 745 阅读 · 0 评论 -
Java设计模式——适配器模式
适配器模式原理:通过继承来实现适配器功能。当我们要访问的接口A中没有我们想要的方法 ,却在另一个接口B中发现了合适的方法,我们又不能改变访问接口A,在这种情况下,我们可以定义一个适配器p来进行中转,这个适配器p要实现我们访问的接口A,这样我们就能继续访问当前接口A中的方法(虽然它目前不是我们的菜),然后再继承接口B的实现类BB,这样我们可以在适配器P中访问接口B的方法了,这时我们在适配器P中的...原创 2019-01-04 14:52:38 · 487 阅读 · 0 评论 -
Java设计模式——装饰模式
装饰模式顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例,关系图如下:Source类是被装饰类,Decorator类是一个装饰类,可以为Source类动态的添加一些功能,代码如下:public interface Sourceable { public void method(); }pu...原创 2019-01-04 15:16:20 · 414 阅读 · 0 评论 -
Java设计模式——代理模式
代理模式其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思。再如我们有的时候打官司,我们需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们的想法。先来看看关系图:代理模式和装饰模式非常类似,甚至代码都类...原创 2019-01-04 15:21:24 · 470 阅读 · 0 评论 -
Java设计模式——观察者模式
观察者模式包括这个模式在内的接下来的四个模式,都是类和类之间的关系,不涉及到继承,学的时候应该 记得归纳,记得本文最开始的那个图。观察者模式很好理解,类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,经常会看到RSS图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种...原创 2019-01-07 09:47:42 · 432 阅读 · 0 评论 -
Java设计模式——抽象工厂模式
为什么要用抽象工厂模式工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。工厂模式和抽象工厂模式的区别是什么呢?这两种设计模式主要的区别在于产品,工厂模式是用来创建同一...原创 2019-01-04 10:23:50 · 444 阅读 · 0 评论 -
Java设计模式——单例模式
为什么要用单例模式单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。省去了new操作符,降低了系统内存的使用频率,减轻GC压力。有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了。(比如一个军队出...原创 2019-12-15 10:54:47 · 457 阅读 · 0 评论 -
重构——Search Bad Code
Duplicated Code首当其冲的当然是冗余代码。最单纯的冗余,是同一个函数包含两个相同的表达式。这时候需要采用Extract Method提炼出重复的代码。两个互为兄弟的子类包含同一个表达式。这时候需要对两个类使用Extract Method并且将提炼出的代码使用Pull Up Method,将其推入超类。而如果代码之间只是类似,并非完全相同,那么就得运用Extract Metho...原创 2019-01-08 14:23:09 · 437 阅读 · 0 评论 -
重构——重构组织函数(1)
Extract Method将一段代码放入一个独立函数中,并让函数名称解释该函数的用途。动机:当看到一个过长的函数或者一段需要注释才能让人理解用途的代码,一般将这个代码放入一个独立函数中。并且独立函数的命名要很好的解释这个函数的作用。范例:无局部变量void printOwing{ Enumeration e=orders.elements(); double outstanding=...原创 2019-01-08 15:44:30 · 421 阅读 · 0 评论 -
重构——重构组织函数(2)
Introduce Explaining Variable有一个复杂的表达式,将该复杂表达式的结果放入一个临时变量,以此变量的名称来解释表达式用途。动机:在某些情况下,表达式可能非常的复杂以至于难以阅读。这样,临时变量可以帮助你将表达式分解为比较容易管理的形式。 在条件逻辑中,引入解释性变量就显得比较有价值。本文的重构手法是比较常见的手法之一,但是对其的使用又不是那么的多。因为一般情况下,我们...原创 2019-01-08 16:40:29 · 556 阅读 · 0 评论 -
重构——重构组织函数(3)
Replace Method with Method Object你有一个大型函数,其中对局部变量的使用使你无法采用“Extract Method”这种重构手法。将这个函数放进一个单独对象中,这样,局部变量就成了对象的字段,然后就可以在同一个对象中将这个大型函数分解为多个小型函数。//重构前class Order.... double price(){ double basePrice...原创 2019-01-08 16:55:10 · 491 阅读 · 0 评论 -
重构——在对象之间搬移特性(1)
我们都知道,类往往因为承担过多的责任而变得臃肿不堪。这种情况下,一般会使用"提炼类"这种手法将一部分责任分离出去。如果一个类变得"不负责任",一般会使用“内联类”这种手法将它融入另一个类。如果一个类使用了另一个类,一般会运用"隐藏委托关系"手法将这种关系隐藏起来通常是有帮助的。有时候隐藏委托关系会导致拥有者的接口经常性地变化,这时就可考虑使用"移除中间人"这种手法了。Move Method若发...原创 2019-01-09 09:51:03 · 528 阅读 · 0 评论 -
重构——在对象之间搬移特性(2)
Inline Class某个类并没有做太多的事情。应该将这个类的所有特性搬移到另一个类中,然后移除原类。过程与Extract Class相反,不再做介绍。Hide Delegate客户通过一个委托关系来调用另一个对象。应当在服务类上建立客户所需的所有函数,用以隐藏委托关系。动机:我们都知道,”封装“即使不是对象的最为关键的特征,也是最为关键的特征之一。 ”封装“意味着每个对象都应该尽...原创 2019-01-09 10:13:35 · 663 阅读 · 0 评论 -
重构——写在后面
重构方法有很多,但是只要满足以下条件,怎么重构都是合理的:原则一:(SRP:Single responsibility principle)单一职责原则又称单一功能原则核心:解耦和增强内聚性(高内聚,低耦合)描述:类被修改的几率很大,因此应该专注于单一的功能。如果你把多个功能放在同一个类中,功能之间就形成了关联,改变其中一个功能,有可能中止另一个功能,这时就需要新一轮的测试来避免可能出现...原创 2019-01-09 10:16:46 · 434 阅读 · 0 评论 -
JavaVM——Java内存区域与内存溢出异常
由于Java把内存控制的权力移交给了Java虚拟机,所以一旦出现了内存泄漏和溢出方面的问题,如果不了解虚拟机是怎么样使用内存的,那么排查错误将会成为一项异常艰难的工作。运行时数据区域Java虚拟机在执行Java程序的过程中,会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在。有些区域则依赖用户线程的启动和结束而建立和销...原创 2019-01-09 16:48:20 · 523 阅读 · 0 评论 -
JavaVM——垃圾收集器与内存分配策略
GC概述GC需要完成的3件事:哪些内存需要回收?什么时候回收?如何回收?上一篇文章介绍了Java内存运行时区域的各个部分。其中程序计数器、虚拟机栈、本地方法栈3个区域随线程生死;栈中的栈帧随着方法的进入和退出而入栈和出栈。每一个栈帧中分配多少内存基本是在类结构确定下来时就已知了(尽管运行时期会由JIT编译器进行一些优化)。因此这3个区域不需要过多考虑回收的问题,方法结束或者线程结束...原创 2019-01-10 11:02:47 · 413 阅读 · 0 评论 -
JavaVM——虚拟机性能监控与故障处理工具
前面介绍了虚拟机内存分配与回收技术等各方面的知识。理论总是为实现指路的工具,所以能把这些知识运用到实际工作中才是我们的最终目的。JDK命令行工具我们知道,JDK的bin目录下有java.exe和javac.exe这两个命令行工具,但并非所有程序猿都了解bin目录中其他命令行工具的作用。在本文,我们将介绍这些工具的其中一部分,主要包括用于监视虚拟机和故障处理的工具。说起JDK工具,注意到这...原创 2019-01-10 11:39:16 · 485 阅读 · 0 评论 -
重构——重构原则
何谓重构目的在于不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。重构可能会在软件内部做修改,但是对软件的外部行为造成很小改变,或者不造成改变。与之相比的是性能优化。为何重构程序的设计会逐渐腐败,当人们只为了短期目的,或者未在完全理解代码整体设计之前就贸然修改代码,程序会逐渐失去自己的结构,程序猿会越来越难通过阅读代码而理解原来的设计。代码结构的流失是累积的,所以应该进行经常性...原创 2019-01-08 13:33:12 · 947 阅读 · 0 评论