Java的设计模式之开篇(1)
什么是设计模式呢?这个问题曾经一直困扰着我,以前我一直以为这是门新的技术,但是随着工作年限和工作经验的增加,其实设计模式就是已经在众多软件系统得到验证的成功的并且可复用的技术方案或者解决问题的方案。Java是目前最主流的开发语言之一,在众多的实践中,总结出了多个设计模式,学习这个模式有助于程序员写出高质量的而又有效的代码。因此一种设计模式能够解决类似的问题,并加以复用。但是在实际的编程中可能在解决一个问题时组合使用多个设计模式,这就要我们要活学活用了。
对于Java的设计模式来说,目前流行的主要有23种,这些设计模式解决了Java程序开发中的大多数的设计问题。在这先说说代码编程中的一些原则,也就是设计模式的初衷吧。
1.面向抽象原则
指当设计一个类 时,不让该类面向具体的类,而是面向抽象类或者接口类,即所设计类中的重要数据是抽象类或者接口声明的变量,而不是具体声明的变量。我的理解是Java里的多态,就是一个模块中各个功能点都会用到方法的高度抽象和提取,是普遍具有的行为动作。往往找这个抽象类比较难,需要不断思考,然后抽丝剥茧。
2.开 - 闭原则
就是让设计对扩展开放,对修改关闭。怎么理解这句话呢?其实是指当一个设计中增加新的模块时,不需要修改现有的模块。在给出一个设计时,要充分考虑客户需求的变化,将客户变化的部分设计为对外扩展开放,而设计的核心部分是经过精心考虑之后确定下来的基本结构,这部分要对修改关闭。也就是说不能因为用户的需求变化了,核心的基本结构代码做修改。遵守开 - 闭原则的设计肯定是易于维护的,因为在设计中增加新的模块是,不用修改设计中的核心模块。
这里不是说系统的每个部分都要遵守这个原则,而是在把主要精力集中在应对设计中最有可能因为需求变化而需要改变的地方,然后想办法应有这个原则加以解决。
当设计一个系统时,经常需要面向对象来考虑系统的总体设计,不要考虑具体类,这样就容易设计出满足 开 - 闭 原则的系统,在程序设计好以后,首先对abstract类的修改关闭,否则,一旦修改abstract类,比如,增加一个abstract方法,那么所有的子类都要进行修改;应当增加abstract类的子类开发,即在程序中再增加子类时,不需要修改其他面向抽象类而设计的重要类。
3.多用组合少用继承原则
(1)继承和复用
子类继承父类的方法可以作为自己的方法,实现了代码的复用,并且可以重写父类的方法,用于扩展。
但是子类和父类是强耦合的关系,也就是说父类修改时势必会影响子类,并且父类的内部结构,子类也是一清二楚。
(2)组合与复用
一个类可以把对象作为自己的成员变量,那么这个类就是其他类的组合了,那么其他对象就可以调用该对象的方法了。
当前对象包含的对象中方法的具体实现对当前对象是不可见的;
组合关系是弱耦合关系,修改当前对象所包含的对象中代码不用修改当前对象代码;
当前对象可以在运行是动态指定所包含的具体对象,例如成员变量是个接口,运行时可以动态指定实现类;
这个缺点就是可能会导致系统中的对象过多,为了组合多个对象必须得仔细对接口进行定义。
(3)多用组合,少用继承
这样做的目的就是为了写出低耦合的代码。
4.高内聚 - 低耦合原则
如果类中的方法是一组相关的行为,则称该类是高内聚,反之称为低内聚。高内聚便于类的维护,低内聚不利于维护。
低耦合就是尽量不要让一个类含有太多其他类的实例引用,避免修改系统其中一部分会影响其他部分。
Java的设计模式之开篇(1)的更多相关文章
- 从.Net到Java学习第一篇——开篇
以前我常说,公司用什么技术我就学什么.可是对于java,我曾经一度以为“学java是不可能的,这辈子不可能学java的.”结果,一遇到公司转java,我就不得不跑路了,于是乎,回头一看N家公司交过社保 ...
- 基于java的设计模式入门(1)——为什么要学习设计模式
大年初一,楼主在这里给大家拜年,祝大家码上升职加薪,码上有对象结婚,码上有车有房,幸福安康. 过完年,回学校注册报道之后,大概就要回深圳到公司开始实习了.提高自己,无非就有两种方式,一是看书学习,二是 ...
- Java 反射 设计模式 动态代理机制详解 [ 转载 ]
Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...
- 单例模式——Java EE设计模式解析与应用
单例模式 目录: 一.何为单例 二.使用Java EE实现单例模式 三.使用场景 一.何为单例 确保一个类只有一个实例,并且提供了实例的一个全局访问点 1.1 单例模式类图 ...
- 0.Java并发包系列开篇
在我们想要谈论Java并发包(java.util.concurrent)的时候,这是一个头疼的问题,却又是每个Java工程师不得不掌握的一项技能.一直以来都想写一个Java并发包系列,无奈迟迟没有动手 ...
- Java IO设计模式(装饰模式与适配器模式)
01. 装饰模式 1. 定义 Decorator装饰器,就是动态地给一个对象添加一些额外的职责,动态扩展,和下面继承(静态扩展)的比较.因此,装饰器模式具有如下的特征: 它必须持有一个被装饰的对象(作 ...
- java多线程设计模式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt220 java多线程设计模式 java语言已经内置了多线程支持,所有实现Ru ...
- Java经典设计模式之十一种行为型模式(附实例和详解)
Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:Java经典设计模式之 ...
- Java经典设计模式之七大结构型模式(附实例和详解)
博主在大三的时候有上过设计模式这一门课,但是当时很多都基本没有听懂,重点是也没有细听,因为觉得没什么卵用,硬是要搞那么复杂干嘛.因此设计模式建议工作半年以上的猿友阅读起来才会理解的比较深刻.当然,你没 ...
随机推荐
- 内存分析工具 MAT 的使用【转】
转自:http://blog.csdn.net/aaa2832/article/details/19419679/ 1 内存泄漏的排查方法 Dalvik Debug Monitor Server (D ...
- wx.navigateTo的url不生效的问题
比如我要要从index页面跳转到logs. 在跳转的时候应该用switchTab,而不是wx.navigateTo 看api这句话 https://developers.weixin.qq.com/m ...
- vue从一个组件跳转到另一个组件页面router-link的试用
需求从helloworld.vue页面跳到good.vue页面 1.helloworld.vue页面代码 <template> <div class="hello" ...
- linux系统普通用户设置密码
linux系统中如何给一个普通用户grindnt设置密码 一.新密码符合规则,用以下方式修改: #root用户直接更改gridnt密码,不需要输入旧密码 [root@subsname home]# p ...
- Qt的插件开发
写代码都是从不会到会,那么写博客也是同样的道理.从不会到会最实用的办法就是模仿了.关于Qt的知识很多都是学习了CSDN的一位大神 一去二三里.关于Qt插件的开发,我们也从他的文章里面抽丝剥茧,把最本质 ...
- mysql 触发器语法详解
1.创建Mysql触发器: 语法: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW BE ...
- 小程序checkbox调整大小
.cb{ transform: scale(0.6,0.6); } <view> <label class="lab" for="box1"& ...
- vlookup实战_英语单词更新
https://study.163.com/provider/400000000398149/index.htm?share=2&shareId=400000000398149( 欢迎关注博主 ...
- mybatis 的 <![CDATA[ ]]> 标签作用
有个细节一直没有注意到,今天mark一下: mybatis进行时间比较的时候我们会这么写,一直都是在复制粘贴所以没有注意,一个标签<![CDATA[ ]]> 今天在做另外一个有时间比较sq ...
- 利用XMl标签定义动画
渐变透明度动画 <?xml version="1.0" encoding="utf-8"?> <alpha xmlns:android=&qu ...