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经典设计模式之七大结构型模式(附实例和详解)
博主在大三的时候有上过设计模式这一门课,但是当时很多都基本没有听懂,重点是也没有细听,因为觉得没什么卵用,硬是要搞那么复杂干嘛.因此设计模式建议工作半年以上的猿友阅读起来才会理解的比较深刻.当然,你没 ...
随机推荐
- OS创建页目录和页
;开始创建页目录项(PDE) .create_pde: ; 创建Page Directory Entry mov eax, PAGE_DIR_TABLE_POS ; PAGE_DIR_TABLE_PO ...
- [bzoj 4872][六省联考2017]分手是祝愿
传送门 Description N个灯按照1~N标号,按下一个开关i,所有标号是i的约数的开关都改变状态,目标是关掉所有的灯,如果当前最优策略≤k就直接按照最优策略走.否则随机按下一个开关.给出每个灯 ...
- node.js 文件下载
//下载参数 var http = require("http"); var fs = require("fs"); var path = require(&q ...
- php基础总结
目录 PHP开发基础 运算符.表达式和流程控制语句 数组和字符串 函数 PHP与Web页面交互 PHP操作MySQL数据库 面向对象基础 期间看到的几篇有意思的博客 为什么 var_dump(&quo ...
- ML_Homework_Porject_2_LDA_KNN
第二次机器学习的作业完成了,写一下总结. 作业要求:实现用线性判别分析(LDA,LinearDiscriminantAnalysis)的二分类,用KNN比较LDA和PCA在有监督学习下的分类区别. 开 ...
- The First Python man in Github
Python date VS(可视化了一下前几名) 查了下Github上星星最多的Python man 或许这就是目标吧 刚刚改了github.
- php手记之02-tp5请求参数读取三种方式
01-[推荐方式] 当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息.在Thinkphp5.1中,获取请求对象数据,是由think\Request类负责,在很多场合下并不需 ...
- 8.3 Customizing Git - Git Hooks
https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks https://github.com/git/git/blob/master/temp ...
- C# [ThreadStatic] 标记静态字段对多线程执行的影响
类的静态字段在类的实例中是共享的.多个线程修改实例字段的值在对其它线程来说是可见的,这也是clr默认的行为.对静态字段添加ThreadStaticAttribute标记可以改变这种默认的行为. Thr ...
- 简易的CRM系统案例之SpringMVC+JSP+MySQL+myBatis框架版本
主要对上一版DAO框架的替换hibernate变成myBatis 简易的CRM系统案例之SpringMVC+JSP+MySQL+hibernate框架版本 src/mybatis.xml <?x ...