开发原则&设计模式
1、关于软件开发中的开发原则和设计模式:
1.1、开发原则
1.1.1、什么是开发原则?
开发原则就是开发的依据,只要依照这些原则进行开发,将来开发的软件具有很强的扩展力,很低的耦合度。
开发原则不属于java语言,也不属于任何一个编程语言,开发原则属于软件工程学的内容。
1.1.2、常见的开发原则?
- 开闭原则:所有开发原则中有一个最基本的原则,该原则叫做:OCP【开闭原则】,其它所有的原则都是围绕OCP开展的。
* 连接数据库的信息编写到配置文件当中,不要编写到java源程序当中,这就是符合OCP开发原则的。
* 开闭原则指的是:对扩展开放,对修改关闭。
* 开闭原则的本质是:在扩展软件功能的时候,不修改源程序达到轻松扩展。
- 接口隔离原则:
* 一个接口尽可能的定义的专业一些,这个接口只为用户服务,例如:UserService,这个接口只为系统服务,例如SystemService
* 尽可能接口定义的精细一些,以下接口定义的比较宽泛,不够专业,当Person实现这个接口的时候会强制Person实现不应该实现的方法,导致角色污染。
CommonInterface{
void eat();
void sing();
void dance();
void study();
void paxing();
....
....
}
Person implements CommonInterface{
//角色污染
}
- 合成聚合复用原则:
* 尽量使用has a 代替 is a
* 代码要想复用可以使用继承方式,但继承不是一种很好的解决方案,因为继承之后两个类之间的关系比较紧密,其中一个类发生改变的时候,另一个类会受到影响。耦合度高
* 代码要想复用还有另一种方式,就是A对象中含有B对象的引用,这样在A类中可以直接使用B类中的相关方法,这也是达到代码复用,这种方式A类发生改变B类不受影响,耦合度低。
- 迪米特法则:
* 不要和陌生人说话
* 一个软件实体应该和其它的软件实体尽可能少的发生关系。降低耦合度。
- 依赖倒转原则:
* 面向抽象编程,面向接口编程,不要面向具体编程。
* 依赖关系倒转过来
class A{
//假设B类是一个具体的类,就违背了依赖倒转原则。
//因为当B类这个具体的类发生改变之后,A类会受到牵连。
//假设A是上,B是下。此时实际上是“上”依赖“下”
B b;
}
class A{
//假设B是一个接口,不是具体的类,这就符合了依赖倒转原则。
//依赖关系扭转过来了,此时“上”不再依赖“下”,也就是说A不依赖:B1、B2、B3等实现类。
//A面向抽象的B接口。
B b;
}
class B1 implements B{
}
class B2 implements B{
}
class B3 implements B{
}
- 里氏代换原则:
尽可能使用多态语法机制,父类型引用指向子类型对象。
编译阶段绑定父类中的方法,运行阶段动态调用到子类对象中的方法。
总结:
以上所有的开发原则都是为了达到一个共同的目标:高内聚、低耦合。达到高内聚低耦合的好处是,可重用性增强,可扩展性增强。
高内聚表示:专业,只做一件事。只有达到高内聚,才可以达到低耦合,高内聚和低耦合是相辅相成的。
-----------------------------------------------------------------------------------------------------
1.2、设计模式
1.2.1、什么是设计模式?
专门为了解决某个特定的问题而存在的一种固定解决方案,可重复使用。
遇到这个问题,直接套用模式解决。
1.2.2、设计模式和开发原则的关系?
大部分的设计模式都是符合开发原则的。
开发原则概念比较大,设计模式只是为了解决某个特定问题,概念比开发原则小得多。
1.2.3、设计模式包括:
* Gof设计模式
* JavaEE设计模式
*.....
1.2.4、我们通常所说的设计模式是:Gof设计模式,1995年四位作者提出的23种设计模式。
1.2.5、Gof95设计模式分类:
* 创建型设计模式
- 主要用来解决对象的创建问题
* 行为型设计模式
- 这些设计模式主要和算法、方法有关的设计模式
* 结构型设计模式
- 更多的类更多的对象组合成更大的结构来解决某个特定的问题
1.2.6、JavaEE的设计模式包括:
* 单例模式【创建型】
- 单例模式的构造函数私有化,这也是真单例的标准。
- 单例模式的真实应用场景:
* 由于构造方法只执行一次,在构造方法中解析xml配置文件,可保证配置文件只被解析一次。当然,这种机制也可以在静态代码块中完成。
* 单例模式的对象无法被垃圾回收器回收,所以通常使用单例模式来实现缓存机制。因为缓存是不希望被回收的。
- 其实除了真单例之外,还存在假单例,例如:Servlet就是一个假单例,因为Servlet构造方法没有私有化,由于Servlet对象的生命周期
由容器来管理,程序员无权干涉,所以Servlet对象也是一个单实例的。
- 单例模式包括:饿汉和懒汉
* 饿汉:类加载时创建对象
* 懒汉:方法调用的时候创建对象,懒汉单例存在线程安全问题,需要加synchronized进行同步。
public synchronized static Singleton getInstance(){
if(s == null){
s = new Singleton();
}
return s;
}
单例模式的类无法被继承。因为子类需要调用父类中的构造方法,单例模式的构造方法私有化,在子类中无法调用,所以单例模式的类型无法被继承。
* 工厂模式【创建型】
- 简单工厂:生产单系列的产品
- 工厂方法:生产多系列的产品
- 抽象工厂:生产多系列的产品,并且加入反射机制....
* 模板方法设计模式【行为型】
- 代表是:HttpServlet
* 责任链设计模式【行为型】
- 过滤器 servlet规范中的Filter
- 拦截器 springmvc中的Interceptor
责任链设计模式:能够在运行阶段做到方法的动态调用组合,能够让程序的达到真正意义上的可插拔性
责任链设计模式要想实现的话,必须采用相关的配置文件,通过修改配置文件来实现运行期绑定
* 策略模式【行为型】
- 集合中的Comparator
* 迭代模式【行为型】
- 集合中的Iterator
* 监听模式【行为型】
- Servlet中的Listener:ServletContextListener
* 适配器模式【结构型】
- GenericServlet
* 装饰器模式【结构型】
- IO流
* 代理模式【结构型】
- Spring中的AOP就是使用代理模式实现的。
==============================
1.1. 常见的UML图有哪些?
类图:Class Diagram
描述类的详细信息,以及描述类和类之间的关系信息【ER图、CDM概念数据模型】
用例图:Use Case Diagram
站在系统用户的角度,分析系统存在哪些功能
时序图:Sequence Diagram
描述一个功能的实现流程,方法的调用过程
状态图:Statechart Diagram
=============================
泛化 A is a B B继承A
实现
A is like a B, 类和接口
关联关系
聚合
合成
依赖
开发原则&设计模式的更多相关文章
- 《敏捷软件开发-原则、方法与实践》-Robert C. Martin读书笔记(转)
Review of Agile Software Development: Principles, Patterns, and Practices 本书主要包含4部分内容,这些内容对于今天的软件工程师 ...
- 面系那个对象开发原则.高内聚.低耦合+Python安装详细教程+print输出带颜色的方法
面系那个对象开发原则.高内聚.低耦合 软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准.划分摸块的一个准则就是高内聚低耦合. 这是软件工程中的概念,是判断设计好坏的标准,主要是面向OO的设计, ...
- IOS开发常用设计模式
IOS开发常用设计模式 说起设计模式,感觉自己把握不了笔头,所以单拿出iOS开发中的几种常用设计模式谈一下. 单例模式(Singleton) 概念:整个应用或系统只能有该类的一个实例 在iOS开发我们 ...
- 10 位顶级 PHP 大师的开发原则
10 位顶级 PHP 大师的开发原则 ruby_chen 发布于: 2013年03月28日 (61评) 分享到: 收藏 +139 #深圳# 6月10日 亚马逊AWSome Day云计算免费培训报 ...
- 一个开发原则:永远不要返回NULL
看一篇文章:10个经典的java开发原则,里面一个原则:永远不要返回NULL. 说实在的,我对这个原则体会不是很深,平时在使用对象前,检查是否为null已经成了习惯,也是我要求开发人员的一个标准动作. ...
- KISS My YAGNI,KISS (Keep It Simple, Stupid)和 YAGNI (You Ain’t Gonna Need It)软件开发原则
http://www.aqee.net/kiss-my-yagni/我们都知道KISS (Keep It Simple, Stupid)和 YAGNI (You Ain’t Gonna Need It ...
- 为何Google这类巨头会认为敏捷开发原则是废话?
[编者按]这是一个来自Quora的问题.Rocket程序员Jasmine Adamson在文中表达了敏捷开发原则是废话的观点,他觉得现实生活中没有什么人会推崇这些原则来工作,不过他们仍然在说其所做的是 ...
- SeaJS基本开发原则
SeaJS基本开发原则在讨论SeaJS的具体使用前,先介绍一下SeaJS的模块化理念和开发原则.使用SeaJS开发JavaScript的基本原则就是:一切皆为模块.引入SeaJS后,编写JavaScr ...
- 菜鸡的Java笔记 简单JAVA 类的开发原则以及具体实现
/* 现在要求定义一个雇员信息类 在这个类之中包含有雇员编号 姓名 职位 基本工资 佣金等信息 对于此时给定要求实际上就是描述一类事物,而这样的程序类在在java之中可以将其称为简单java类 ...
随机推荐
- shell入门-awk-3
awk的内置变量 NR 表示行 NF 表示段 显示第十行 [root@wangshaojun ~]# awk -F ':' 'NR==10' 1.txtuucp:x:10:14:uucp:/var/s ...
- 记一次SQL xml字段关联查询
需求: 一张表是APP表,结构如下: app_category为该游戏所属的类别ID,xml字段类型 另一张表是类别表,就ID对应名称,这就不上图了. 还有一张表是每个游戏的下载记录,结构如下: Do ...
- mongodb-help功能
mongo-help功能 version:2.6.12下面是示例: > help db.help() help on db methods db.m ...
- SQL语言 持续更新中……
SQL提供了很多的聚集函数 COUNT([DISTINCT\ALL]*) SUM([DISTINCT\ALL]<列名>)AVG().…… WHERE 子句中是不能用聚集函数作为条件表达式 ...
- BOX (UVA-1587) 比较代码书写上的差距
对比一下代码的书写差距: 我的代码: #include<iostream> using namespace std; ]; ]; ]; //访问标记 bool judge(int i, i ...
- C#中类和结构体
结构体 类 自己的一些理解 首先结构中不能给字段赋值 而类可以 结构调用方法是 例如 People p1: 类的调用方法是 Book b =new Book(): 1.类能够实例化 而结构不可以 ...
- Sharepoint2013商务智能学习笔记之Secure Store Service服务配置(二)
Secure Store Service 是运行在应用程序服务器上的授权服务,它提供一个存储用户凭据的数据库,Secure Store Service 在商务智能中的地位很重要,Sharepoint商 ...
- [CentOS7] SELinux
声明:本文主要总结自:鸟哥的Linux私房菜-第十六章.程序管理與 SELinux 初探,如有侵权,请通知博主 SELinux = Security Enhanced Linux 传统的文件权限与账号 ...
- 分层图最短路【bzoj2834】: 回家的路
分层图最短路[bzoj2834]: 回家的路 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2834 这道题难在建边. 自己写的时候想到了 ...
- php路径问题
./ 是在当前目录开始寻找文件/ 是在下一级目录开始寻找文件 ../ 这个是在上一级目录开始寻找文件 $_SERVER['DOCUMENT_ROOT']获取站点根目录 __FILE__获取当前文件的完 ...