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,  类和接口

关联关系

聚合

合成

依赖

开发原则&设计模式的更多相关文章

  1. 《敏捷软件开发-原则、方法与实践》-Robert C. Martin读书笔记(转)

    Review of Agile Software Development: Principles, Patterns, and Practices 本书主要包含4部分内容,这些内容对于今天的软件工程师 ...

  2. 面系那个对象开发原则.高内聚.低耦合+Python安装详细教程+print输出带颜色的方法

    面系那个对象开发原则.高内聚.低耦合 软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准.划分摸块的一个准则就是高内聚低耦合. 这是软件工程中的概念,是判断设计好坏的标准,主要是面向OO的设计, ...

  3. IOS开发常用设计模式

    IOS开发常用设计模式 说起设计模式,感觉自己把握不了笔头,所以单拿出iOS开发中的几种常用设计模式谈一下. 单例模式(Singleton) 概念:整个应用或系统只能有该类的一个实例 在iOS开发我们 ...

  4. 10 位顶级 PHP 大师的开发原则

    10 位顶级 PHP 大师的开发原则 ruby_chen 发布于: 2013年03月28日 (61评) 分享到:    收藏 +139 #深圳# 6月10日 亚马逊AWSome Day云计算免费培训报 ...

  5. 一个开发原则:永远不要返回NULL

    看一篇文章:10个经典的java开发原则,里面一个原则:永远不要返回NULL. 说实在的,我对这个原则体会不是很深,平时在使用对象前,检查是否为null已经成了习惯,也是我要求开发人员的一个标准动作. ...

  6. 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 ...

  7. 为何Google这类巨头会认为敏捷开发原则是废话?

    [编者按]这是一个来自Quora的问题.Rocket程序员Jasmine Adamson在文中表达了敏捷开发原则是废话的观点,他觉得现实生活中没有什么人会推崇这些原则来工作,不过他们仍然在说其所做的是 ...

  8. SeaJS基本开发原则

    SeaJS基本开发原则在讨论SeaJS的具体使用前,先介绍一下SeaJS的模块化理念和开发原则.使用SeaJS开发JavaScript的基本原则就是:一切皆为模块.引入SeaJS后,编写JavaScr ...

  9. 菜鸡的Java笔记 简单JAVA 类的开发原则以及具体实现

    /*  现在要求定义一个雇员信息类 在这个类之中包含有雇员编号 姓名 职位 基本工资 佣金等信息    对于此时给定要求实际上就是描述一类事物,而这样的程序类在在java之中可以将其称为简单java类 ...

随机推荐

  1. 关于Android阻塞的解决方法

    首先新建一个线程,然后有两种方法 1.POST方法(直接,但是可读性差) 2.使用AnycTask类,可读性好,而且是POST方法的封装

  2. [poj1273]Drainage Ditches(最大流)

    解题关键:最大流裸题 #include<cstdio> #include<cstring> #include<algorithm> #include<cstd ...

  3. pig语法学习 FOREACH GENERATE group AS

    深入浅出,转一个 转载必须注明出处:http://www.codelast.com/ 转载地址 本文可以让刚接触pig的人对一些基础概念有个初步的了解. 本文大概是互联网上第一篇公开发表的且涵盖大量实 ...

  4. 1. csrf 简介

    浅谈CSRF CSRF是什么? (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 年曾被列为互联网 大安全隐患之一,也被称为“One Click A ...

  5. Mac效率工具推荐

    1.Homebrew 命令行安装神器 https://brew.sh/index_zh-cn.html 2.Alfred 类似spotlight,功能更强大 https://www.alfredapp ...

  6. git 把文件从 版本管理中移除 andorid版本

    刚学git时,一股脑吧所有文件全部加到版本管理中,现在做Android开发,这样做就有很大的问题了,gen  和bin  文件夹下的文件是编译生成的,最好不要加到版本管理中,最好加入到.gitigno ...

  7. 讲完.class,Class之后,继续。

    讲完.class,Class之后,继续. 1)泛化的Class引用 Class也可以加入泛型,加入之后会进行类型检查. 贴一下书上原话,Class<?>优于Class,虽然他们是等价的,C ...

  8. 我的省选 Day -11

    Day -11 上了一天的文化课,晚上才来到机房(神秘的一天.. 班里前一半的JuLao们都去参加省质检的同步赛了, 然而我太菜,早就跌到班级的中下下了(所以没得参加.. 所以今天上课时特别尴尬,班级 ...

  9. webpack分包:vue单页面解决分包【减少首屏加载时间】--按需加载[路由懒加载]

    1.使用webpack中的syntax-dynamic-import 插件 npm install --save-dev babel-plugin-syntax-dynamic-import 2.配置 ...

  10. AT2689 Prime Flip

    传送门 这个题是真的巧妙 首先一个很巧妙的思路,差分 考虑假如\(a_i!=a_{i-1}\),则\(b_i=1\),否则\(b_i=0\) 这样一来,一个区间的翻转就变成了对于两个数的取反了 然后我 ...