设计模式
文章平均质量分 76
也曾眼眸有光
天空即在我们头上也在我们脚下
展开
-
设计模式之美-结构型模式-装饰器模式
装饰器模式主要解决继承关系过于复杂的问题,通过组合来替代继承。指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,装饰器模式提供了比继承更有弹性的替代方案将功能附加到对象上。因此,装饰器模式的核心功能是功能扩展,使用装饰器模式可以透明且动态的扩展类的功能。装饰器模式还有一个特点,那就是可以对原始类嵌套使用多个装饰器。为了满足这个应用场景,在设计的时候,装饰器类需要跟原始类继承相同的抽象类或者接口。原创 2023-04-13 16:37:13 · 645 阅读 · 1 评论 -
设计模式之美-结构型模式-桥接模式
定义中的“抽象”,指的并非“抽象类”或“接口”,而是被抽象出来的一套“类库”,它只包含骨架代码,真正的业务逻辑需要委派给定义中的“实现”来完成。而定义中的“实现”,也并非“接口的实现类”,而是的一套独立的“类库”。实现部分,可以为接口或者是抽象类,其方法不一定要与抽象部分中的一致,一般情况下是由实现部分提供基本的操作,而抽象部分定义的则是基于实现部分基本操作的业务方法。桥接模式可以取代多层继承的方案。桥接模式极大的提高了系统可扩展性,在两个变化维度中任意扩展一个维度,都不需要修改原有的系统,符合开闭原则。原创 2023-03-31 17:17:47 · 646 阅读 · 0 评论 -
设计模式之美-结构型模式-代理模式
在不改变原始类(或叫被代理类)的情况下,通过引入代理类来给原始类附加功能。一般情况下,我们让代理类和原始类实现同样的接口。但是,如果原始类并没有定义接口,并且原始类代码并不是我们开发维护的。在这种情况下,我们可以通过让代理类继承原始类的方法来实现代理模式。静态代理需要针对每个类都创建一个代理类,并且每个代理类中的代码都有点像模板式的“重复”代码,增加了维护成本和开发成本。对于静态代理存在的问题,我们可以通过动态代理来解决。原创 2023-03-29 16:39:11 · 457 阅读 · 0 评论 -
设计模式之美-创建型模式-原型模式
浅拷贝:当拷贝对象包含基本数据类型(如int、long)或者不可变的对象(如字符串、基本类型的包装类)时,会直接将这些属性复制到新的对象中。如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式来创建新对象,以达到节省创建时间的目的。2、安全访问场景:当某个对象对外可能是只读的,为了防止外部对这个只读对象的修改,通常可以通过返回一个对象拷贝的形式实现只读的限制。现在已经有很多针对浅深拷贝的工具类。原创 2023-03-22 16:51:09 · 438 阅读 · 0 评论 -
设计模式之美-创建型模式-建造者模式
2.在建造过程完成后,提供产品的实例。认识这点是很重要的,因为在建造模式中,强调的是固定整体构建的算法,而灵活扩展和切换部件的具体构造和产品装配的方式。**建造模式可以强制实行一种分步骤进行的建造过程,因此,如果产品对象的一个属性必须在另一个属性被赋值之后才可以被赋值,使用建造模式是一个很好的设计思想。应当指出的是,导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色。2、建造者抽象(Builder):建造者的抽象类,规范产品对象的各个组成部分的建造,一般由子类实现具体的建造过程。原创 2023-03-14 16:55:56 · 333 阅读 · 0 评论 -
设计模式之美-创建型模式-工厂与抽象工厂模式
分类:简单工厂模式(静态工厂模式),工厂方法模式,抽象工厂模式。这种设计模式也是 Java 开发中最常见的一种模式,它的主要意图是定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。简单说就是为了提供代码结构的扩展性,屏蔽每一个功能类中的具体实现逻辑。让外部可以更加简单的只是知道调用即可,同时,这也是去掉众多ifelse的方式。当然这可能也有一些缺点,比如需要实现的类非常多,如何去维护,怎样减低开发成本。但这些问题都可以在后续的设计模式结合使用中,逐步降低。原创 2023-03-10 14:59:58 · 780 阅读 · 0 评论 -
设计模式之美-创建型模式-单例模式
进程在使用这个单例对象的时候,需要先从外部共享存储区中将它读取到内存,并反序列化成对象,然后再使用,使用完成之后还需要再存储回外部共享存储区。对应地,“多例”指的就是一个类可以创建多个对象,但是个数是有限制的,比如只能创建 3 个对象。单例类中对象的唯一性的作用范围是“进程唯一”的。实际上,“进程唯一”就意味着线程内、线程间都唯一,这也是“进程唯一”和“线程唯一”的区别之处。饿汉式的实现方式,在类加载的期间,就已经将 instance 静态实例初始化好了,所以,instance 实例的创建是线程安全的。原创 2023-03-10 14:47:56 · 668 阅读 · 1 评论 -
Java中的一些编程规范
除此之外,值得强调的是,不管是用两格缩进还是四格缩进,在使用 tab 键进行缩进时要注意缩进格数,因为在不同的IDE,tab键的缩进格数是不一致的,当然IDE也提供了设置tab键的缩进格数来帮助我们解决此问题,所以到底使用空格还是tab可以根据个人习惯选择。但是,将大括号另起一行,也有它的优势,那就是,左右括号可以垂直对齐,哪些代码属于哪一个代码块,更加一目了然。一般可以借助类的信息来简化属性、函数的命名,利用函数的信息来简化函数参数的命。作用域小的变量(比如临时变量),可以适当地选择短一些的命名方式。原创 2022-12-22 11:35:46 · 708 阅读 · 0 评论 -
设计模式之美-重构
大规模高层次重构:指的是对顶层代码设计的重构,包括系统、模块、代码结构、类与类之间的关系等的重构,重构的手段有:分层、模块化、解耦、抽象可复用组件等等。小规模低层次的重构:指的是对代码细节的重构,主要是针对类、函数、变量等代码级别的重构,比如规范命名、规范注释、消除超大类或函数、提取重复代码等等。优秀的代码或架构不是一开始就能完全设计好的,我们无法 100% 遇见未来的需求,也没有足够的精力、时间、资源为遥远的未来买单,所以,随着系统的演进,重构代码也是不可避免的。重构是避免过度设计的有效手段。原创 2022-12-15 14:56:40 · 527 阅读 · 0 评论 -
设计模式之美-设计原则-KISS,YAGNL,DRY,迪米特法则
迪米特法则是希望减少类之间的耦合,让类越独立越好。每个类都应该少了解系统的其他部分。一旦发生变化,需要了解这一变化的类就会比较少。原创 2022-12-15 14:55:29 · 493 阅读 · 0 评论 -
设计模式之美-设计原则-依赖反转原则
这里所说的“控制”指的是对程序执行流程的控制,而“反转”指的是在没有使用框架之前,程序员自己控制整个程序的执行。我们通过依赖注入框架提供的扩展点,简单配置一下所有需要的类及其类与类之间依赖关系,就可以实现由框架来自动创建对象、管理对象的生命周期、依赖注入等原本需要程序员来做的事情。我们不通过 new 的方式在类内部创建依赖类的对象,而是将依赖的类对象在外部创建好之后,通过构造函数、函数参数等方式传递(或注入)给类来使用。依赖反转原则也叫作依赖倒置原则。抽象不要依赖具体实现细节,具体实现细节依赖抽象。原创 2022-11-29 11:56:22 · 202 阅读 · 0 评论 -
设计模式之美-设计原则-单一职责原则
随着业务的发展,如果粗粒度的类越来越庞大,代码越来越多,这个时候,我们就可以将这个粗粒度的类,拆分成几个更细粒度的类。比较难给类起一个合适名字,很难用一个业务名词概括,或者只能用一些笼统的Manager、Context 之类的词语来命名,这就说明类的职责定义得可能不够清晰,需要拆分;私有方法过多,我们就要考虑能否将私有方法独立到新的类中,设置为 public 方法,供更多的类使用,从而提高代码的复用性;类依赖的其他类过多,或者依赖类的其他类过多,不符合高内聚、低耦合的设计思想,我们就需要考虑对类进行拆分;原创 2022-09-27 15:12:34 · 297 阅读 · 0 评论 -
设计模式之美-面向对象
is a代表的是类之间的继承关系,比如PC机是计算机,工作站也是计算机。PC机和工作站是两种不同类型的计算机,但都继承了计算机的共同特性。因此在用Java语言实现时,应该将PC机和工作站定义成两种类,均继承计算机类。has a代表的是对象和它的成员的从属关系。同一种类的对象,通过它们的属性的不同值来区别。比如一台PC机的操作系统是Windows,另一台PC机的操作系统是Linux。操作系统是PC机的一个成员变量,根据这一成员变量的不同值,可以区分不同的PC机对象。原创 2022-09-27 15:11:00 · 303 阅读 · 0 评论 -
设计模式之美-如何评价代码质量的高低,面向对象,设计原则,设计模式,编程规范,重构,五者间的关系
除此之外,代码的易维护性还跟项目代码量的多少、业务的复杂程度、利用到的技术的复杂程度、文档是否全面、团队成员的开发水 平等诸多因素有关。面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式编码实现的基础。持续重构是保持代码质量不下降的有效手段,能有效避免代码腐化到无可救药的地步 ,而重构的工具就是我们前面罗列的那些面向对象设计思想、设计原则、设计模式、编码规范。代码的可复用性可以简单地理解为,尽量减少重复代码的编写,复用已有的代码。原创 2022-09-27 14:43:25 · 188 阅读 · 0 评论