• 【设计模式】设计模式基础知识


    一、什么是设计模式

    设计模式是指在软件开发中,经过验证的,用以解决在特定环境下、重复出现的,特定问题的解决方案。

    在描述单个设计模式时,设计模式通常由以下部分组成。

    模式名称

    环境和问题:描述在什么场景下,出现什么样的特定的问题。

    解决方案:描述如何解决这个问题。

    效果:描述模式应用的效果,以及可能带来的问题,或者使用中需要权衡的问题。

     

    设计模式的分类

    创建型模式:抽象了对象实例化的过程,用来帮助创建对象的实例。

    结构型模式:描述如何组合类和对象以获得更大的结构。

    行为型模式:描述算法和对象间职责的分配。

    二、常见的面向对象设计的原则

    1、单一职责原则SRPSingle Responsibility Principle

    单一职责,指的是,一个类应该仅有一个引起它变化的原因。

    这里所说的原因就是所谓的“职责”,如果一个类有多个引起它变化的原因,那么也就意味着这个类有多个职责,再进一步说,就是把多个职责耦合到一起了。

    这会造成职责的相互影响,可能一个职责的变化,会影响到其他职责的实现,甚至引起其他职责随着变化,这种设计是脆弱的。

    2、开放-关闭原则OCPOpen-Close Principle

    所谓开闭原则,是指一个类应该对扩展开放,对修改关闭,它是设计中一个非常核心的原则。

    开闭原则要求的是,类的行为是可以扩展的,而且是在不修改已有代码的情况下进行扩展,也不必改动已有的源代码或者二进制代码。

    实现开闭原则的关键是合理地抽象、分离出变化和不变化的部分,为变化的部分预留下可扩展的方式,比如,钩子方法或是动态组合对象等。

    3、里氏替换原则LSPLiskov Substitution Priciple

    所谓的里氏替换原则,指的是,子类型必须能够替换掉它们的父类型。这是一种多态的使用情况,它可以避免在多态的应用中,出现某些隐蔽的错误。

    从另外一个角度来说,里氏替换原则是实现开闭的主要原则之一。开闭原则要求对扩展开放,扩展的一个手段就是使用继承;而里氏替换原则是保证子类能够正确替换父类型,只有能正确替换,才能实现扩展,否则扩展了也会出现错误。

    4、依赖倒置原则DIPDependence Inversion Principle

    所谓依赖倒置原则,指的是,要依赖于抽象,不要依赖于具体类。要做到依赖倒置,典型的应该做到:

    高层模块不应该依赖于底层模块,二者都应该依赖于抽象。

    抽象类不应该依赖于具体实现,具体实现应该依赖于抽象类。

    5、接口隔离原则ISPInterface Segregation Principle

    所谓接口隔离原则,指的是,不应该强迫客户依赖于他们不用的方法。

    这个原则用来处理那些比较“庞大”的接口,这种接口通常会声明较多的操作,涉及到很多的职责。客户在使用这样的接口的时候,通常会有很多他不需要的方法,这些方法对于客户来讲,就是一种接口污染,相当于强迫用户在一大堆的方法中去寻找他需要的方法。

    因此这样的接口应该被隔离,应该按照不用客户的需求来分离成为针对客户的需求。这些接口中,只需要声明客户需要的操作声明,这样既方便了客户的使用,也可以避免误用接口而导致的错误。

    分离接口的方式,除了直接进行代码分离之外,还可以用委托来分离接口。

    6、最少知识原则LKPLeast Knowledge Principle

    所谓最少知识原则,指的是,只和自己的朋友谈话。

    这个原则用来执导我们在设计系统的时候,应该尽量减少对象之间的交互,对象只和自己的朋友谈话,也就是只和自己的朋友交互,从而松散类之间的耦合。通过松散类之间的耦合来降低类之间的相互依赖,这样在修改系统的某一个部分的时候,就不会影响其他的部分,从而使系统具有更好的可维护性。

    那么究竟哪些对象才能被的当作朋友呢?最少知识原则提提供了一些执导:

    当前对象本身

    通过方法的参数传递进来的对象

    当前对象所创建的对象

    当前对象的实例变量所引用的对象。

    方法内所创建的或实例化的对象。

    总之,最少知识原则要求我们的方法调用必须保持在一定的界限范围之内,尽量减少对象之间的依赖关系。

    7、其他原则

    面向接口编程

    优先使用组合,而非继承

    一个类需要的数据应该隐藏在类的内部;

    类之间应该零耦合,或者只有传导耦合,换句话说,类之间要么没有关系,要么只使用另一个类的接口提供的操作;

    在水平方向上尽可能统一地分布系统功能。


    三、类图

    1、类图的概念

    类图是静态视图的图形表达方式,表示声明的静态模型元素,如类、类型和其内容,以及它们的相互关系。也就是说,类图是用来描述类及类与类之间关系的一种UML图。

    2、类图的基本表达

    类图的基本模型元素如下图所示:

     

    类的名字

    属性

    操作

    1 类图的基本图示

    属性定义的基本语法:

    属性用来描述类所具有的特征。描述属性的语法格式为:

    可见性属性名:类型名=初始值

    其中属性名和类型名是必须要有的,其他部分是可选的。

    对于可见性:+表示public-表示private#表示protected,没有符号则表示默认的可见性。

    基本的示例如图:

     

    User

    -firstName:String

    -lastName:String

    +fullNameString

    +age:int


    2 带属性的类图

    操作的表示基本语法

    基本语法格式如下:

    可见性 操作名(参数列表):返回值类型

    可见性和属性的描述方式是一样的,都是+表示public-表示private#表示protected,没有符号则表示默认的可见性。

    参数列表由多个参数构成,用逗号分割参数,描述参数的语法格式为:

    参数名:参数类型

    为图2所示的类图添加一个方法:用户可以购买一定数量的某商品,如图3所示:

     

    User

    -firstName:String

    -lastName:String

    +fullNameString

    +age:int

    +buy(name:Product,num:int)void

    3 带操作的类图

    Javastatic的表示

    如果属性或者方法是static的,则在属性或方法定义的下面,添加一条下划线表示static的,如图4所示:

    User

    -age:int=20

    -name:String

    +run(speed:double,durableTime:double):void

    4 带静态属性和静态方法的类图

    3、抽象类和接口

    抽象类的表示是类名倾斜,抽象操作的表示是整条操作定义都倾斜,如图5所示:

    AbstractClass

    -name:String

    +abstractMethod(s:int,b:String):String

    +otherMethod():void

    5 抽象类

    接口是一种特殊的抽象类,归根结底还是类,所以接口的表达基本语法和类是一样的,接口,定义示比如有一个创建用户和删除用户的例如图6所示

    interface

    UserService


    +createUser(name:String,age:int):boolean

    -delUser(name:String):boolean

    6 接口

    四、类之间关系的图示(见文章:http://hi.baidu.com/yanft/item/61692b2d94b7450a42634ac1



    一般什么情况下需要自己实现classloader,例如tomcat,为什么要自己实现classloader

    怎样实现多继承?

  • 相关阅读:
    java URL、HTTP与HTML+CSS
    JDK的图文安装教程
    Java之Tomcat、Dynamic web project与Servlet
    Java基础ArrayList、Servlet与Filter
    JavaMath方法、服务器与Tomcat安装与配置步骤
    关于navicat 系列软件一点击菜单栏就闪退
    Java基础之MySQL数据库与JDBC
    Java中的常用方法
    Java基础之Calendar类、JNDI之XML
    JAVAWEB基础模块开发顺序与数据访问对象实现类步骤
  • 原文地址:https://www.cnblogs.com/yangfengtao/p/2742960.html
Copyright © 2020-2023  润新知