前言

  在我们很多时候设计代码都是需要用到各种不一样的设计模式的,接下来着几篇给大家领略一下设计模式。知道设计模式的作用,以及在代码的具体体现。很多时候我们看不懂代码就是因为我们不知道它使用的设计模式。

  国庆的我很痛苦,学习是痛苦的,成长是快乐的!

一、什么是面向对象

1)面向对象(Object-Orientation,简称OO)是一种系统建模技术/编程思想。

2)面向对象编程(Object-Orientation Programming,简称OOP)是按照OO的方法学来开发程序的编程方式

3) 面向对象分析方法 Object-Oriented Analysis,简称OOA

分析阶段主要解决以下问题:

  • 建立针对业务问题域的清晰视图
  • 列出系统必须要完成的核心任务
  • 针对问题域建立公共词汇表
  • 列出针对此问题域的最佳解决方案

此阶段要解决的核心问题是"what to do?"

4) 面向对象设计 Object-Oriented Design,   简称OOD

设计阶段主要解决以下问题:

  • 如何解决具体的业务问题
  • 引入系统工作所需的各方面的支持元素
  • 定义系统的实现策略

   此阶段要解决的核心问题是"How to do?"

5)OO: 面向对象,是一套集编程思想,方法,原则,模式,解决方案等为一体的编程模式。OO的思想贯穿于整个软件开发的过程,比如需求分析,设计,编程,测试,升级等。

综上可以知道什么是OOAD?

OOAD(Object Oriented Analysis Design,面向对象的分析和设计,面向对象分析与设计)是现代软件企业广为采用的一项有效技术。OOAD方法要求在设计中要映射现实世界中指定问题域中的对象和实体,

例如:顾客、汽车和销售人员等。这就需要设计要尽可能地接近现实世界,即以最自然的方式表述实体。所以面向对象技术的优点即为能够构建与现实世界相对应的问题模型,并保持他们的结构、关系和行为为模式。

二、面向对象的特点

2.1、抽象

  抽象就是将一些事物的共性和相似点抽离出来,并将这些属性归为一个类,这个类只考虑这些事物的共性和相似之处,并且会忽略与当前业务和目标无关的那些方面,只将注意力集中在与当前目标有关的方面。  

  忽略掉一个对象或实体的细节而只关注其本质特征的过程。

2.2、封装

  封装是为了隐藏内部实现细节,是保证软件部件具有优良的模块性的基础。封装的目标就是要实现软件部件“高内聚,低耦合”,防止程序之间的相互依赖性带来的变动影响。  

  目的:实现信息的隐藏
  1)属性信息
  2)行为的操作的信息
    隐藏方法实现的细节。
    代码重用。

2.3、继承  

  在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法(Override,重写方法)使之更适合特殊的需要,这就是继承。
  继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。

  is a

1)子类可以继承父类的属性、方法
        2)子类可以有自己的特性存在。

2.4、多态  

  多态是运行时刻接口匹配的对象相互替换的能力。指程序定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编译期并不确定,而是在程序运行期间才确定(称之为动态绑定),
    即一个引用变量指向的是哪个类的实例对象,在编译期间并不确定,在运行阶段才能决定,因此,这样就可以使得引用变量绑定到各种不同的类实现上,从而实现不同的行为。多态性增强了软件的灵活性和扩展性。

  多态:相同类域的不同对象调用相同方法时的不同表现形式

Personp1=newStudent();
Personp2=newTeacher();
p1.work();//听课
p2.work();//讲课

1)子类继承父类,类实现接口 
        2)子类重写父类的同名方法,类实现接口中的抽象方法 
        3)父类的引用指向子类的对象,接口类型的引用指向具体实现类的对象

重写/重载
            编译时多态:重载
            运行时多态:重写

三、OOP(面向对象编程)

  类:属性     方法

抽象                        实例化
   事物--------------->类-------------->内存中的对象

3.1、对象分类

域对象:在整个对象的设计过程中,侧重于做数据的封装/传递。用来做数据处理的类,信息的载体。POJO,JavaBean.

行为对象:侧重于行为的操作,逻辑的实现。此类对象常见于接口的实现类,抽象类的扩展类.

3.2、类(对象)之间的关系

1)继承关系:is a

2)依赖关系:类A对象中并不需要存在有类B类型的对象属性,而是在使用时,直接在方法中实例化类B(new对象)来调用相关的业务方法来完成整个业务操作。

3)关联关系:对象之间交互时的一种引用方式,当一个对象通过另外一个对象的引用(成员变量)去使用另外一个对象的服务或操作时,两个对象时间便产生了关联。

关联关系又可总体分为聚合关系和组合关系:

聚合关系和组合关系的特点及其区别:

1.聚合关系也称"has-a"关系,组合关系也称"contains-a"关系
                    聚合(Aggregation): ---Has a---------人拥有电脑
                    组合(Composition): ---Contains a---人是由脚、身体、头等部分组成的

2.聚合关系表示事物的整体/部分关系的较弱情况,组合关系表示事物的整体/部分关系的较强的情况.

3.聚合关系中,代表部分事物的可以属于多个聚合对象,可以为多个聚合对象共享,而且可以随时改变它所从属的聚合对象.代表部分事物的对象与代表聚合事物对象的生存期无关,

一旦删除了它的一个聚合对象,不一定也就随即删除代表部分事物的对象.
                  在组合关系中,代表整体事物的对象负责创建和删除代表部分事物的对象,代表部分事物只属于一个组合对象.一旦删除了组合对象,也就随即删除了相应的代表部分事物的对象.

3.3、OOP的过程中核心原则

1)尽量能使用封装的特性就是用封装

2)面向接口编程

3)重组合/聚合而轻继承

四、抽象类和接口的选择问题

4.1、语法角度

Interface:
            属性:public static final
            方法:只能是抽象方法(JDK8除外)
            注意: 可以没有任何方法
            作用: 被类实现

abstract class
            属性:正常属性
            方法:可以是普通方法,也可以是抽象方法
            注意: 可以没有任何抽象方法
            作用: 被类继承

4.2、设计角度

一个类可以实现多个接口
        一个类只能继承一个父类
        接口是抽象类的极致的抽象

4.3、思想角度

类进行抽象的时候是否关注属性

尽量让问题域独立存在,尽量不要把所有的属性或者方法都放到一个抽象类或者接口中

4.4、举例

一个关于门的设计问题

门都有俩个基本的行为 open close

将来系统中会出现很多种门(不同的类)
        MyDoor1 MyDoor2 MyDoor3 MyDoor4

这些类都具备open close的行为,但是具体实现又不一样.
    如何选择:
        1.抽象出一个抽象类,类中俩个抽象方法open close 
        2.抽象出一个接口,接口中俩个抽象方法open close

alarm

将来多了一个新的功能:警报器
  1)抽象出一个抽象类,类中俩个抽象方法open close
           MyDoor1 extends Door

  2)抽象出一个接口,接口中俩个抽象方法alarm

五、设计模式概述

5.1、定义

  对软件设计问题的可重用的解决方案.

5.2、作用

1)重用设计比重用代码更有意义,可充分利用已有的软件开发经验.
        2)为设计提供共同的词汇,方便交流和书写开发文档.
        3)降低错误可能性.
        4)节省时间.

好的软件系统设计至少应该具备以下三点:
        可扩展性(Extensibility) 
        灵活性(Flexibility)
        可插入性(Pluggability)

5.3、面向对象设计原则

  常用基本的设计原则有七个:

1)单一职责原则(Single Responsibility Principle,SRP)
                类的职责要单一,不能将太多职责放在同一个类中.

2)开闭原则(Open-Closed Principle, OCP)
                对扩展开放,对修改关闭。软件设计应该尽可能的使架构稳定而且又容易满足不同的需求,提高代码可重用性。理论上希望能达到不修改源代码的前提下扩展功能。

3)里氏代换原则(Liskov Substitution Principle,LSP)
                在系统中,一个可以接受基类对象的地方必然可以接受一个子类对象。

4)依赖倒转原则(Dependency Inversion Principle,DIP)
                要针对抽象编程,而不是针对具体类编程.

5)接口隔离原则(Interface Segregation Principle,ISP)
                使用多个专门的接口来取代一个统一的接口.

6)合成复用原则((Composition/Aggregate Reuse Principle,CARP)
                系统中尽量使用组合和聚合的关系,而尽量少用甚至不用继承关系。

7)迪米特法则(Law of Demeter, LoD)
            一个软件实体应当尽量少的与其他实体发生相互作用.
            又叫做最少知道原则。也就是说一个对象应当对其他对象要尽可能少的了解,不要和陌生人说话。

在面向对象中的基本设计原则基础上,又出现了各种各样的设计模式,来解决同一种问题

5.4、面向对象设计模式

  1)GRASP模式:General Responsibility Assignment Software Patterns,通用责任分配软件模式

2) GOF模式(四人帮设计模式):Erich Gamma, Richard Helm, Ralph Johnson,John Vlissides软件设计领域的四位世界顶级大师.合著有《设计模式:可复用面向对象软件的基础》,

提出了23种基本设计模式,从理论高度提炼并规范了设计模式,对面向对象设计,软件复用领域产生了巨大影响。

OOAD-设计模式(一)概述的更多相关文章

  1. Java设计模式之(设计模式的概述)

    概述: 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发 ...

  2. iOS设计模式 - (1)概述

    近期可自由安排的时间比較多, iOS应用方面, 没什么好点子, 就先放下, 不写了.花点时间学学设计模式. 之后将会写一系列博文, 记录设计模式学习过程. 当然, 由于我自己是搞iOS的, 所以之后设 ...

  3. 设计模式——1.概述&UML类图和时序图

    声明:本博客设计模式相关文章均整理和修改自网络,原文地址:图说设计模式 学习设计模式的3个层次—— 1.熟悉所有设计模式: 2.能够用代码实现: 3.运用到工作的项目中. 设计模式指导软件开发,学习设 ...

  4. Java 设计模式(概述)

    设计模式的三个分类                                                                                   创建型模式:对象 ...

  5. java设计模式:概述与GoF的23种设计模式

    软件设计模式的产生背景 设计模式这个术语最初并不是出现在软件设计中,而是被用于建筑领域的设计中. 1977 年,美国著名建筑大师.加利福尼亚大学伯克利分校环境结构中心主任克里斯托夫·亚历山大(Chri ...

  6. 01.GOF设计模式_概述

    0.Abstract Fcatory 提供一个创建一系列相关或者相互依赖对象的接口,而无需指定它们具体的类. 1. Adapter 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原 ...

  7. 设计模式功能概述(Design Patterns)

    1.Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 2.Adapter:将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于 ...

  8. 学习设计模式第二十七 - GoF之外简单工厂模式

    示例代码来自<深入浅出设计模式>和<大话设计模式> 概述 简单工厂模式又被称为静态工厂模式,属于类的创建型模式.其实质是由一个工厂类根据传入的参量,动态决定应该创建出哪一个产品 ...

  9. 粗略。。Java项目设计模式之笔记----studying

    设计模式 设计模式:解决这个问题的一种行之有效的思想. 设计模式:用于解决特定环境下.反复出现的特定问题的解决方式. 设计模式学习概述 ★ 为什么要学习设计模式 1.设计模式都是一些相对优秀的解决方式 ...

  10. Day21_IO第三天

    1.IO体系总图 2.字符流体系图 记忆路线:输入输出流前面加File和Buffered,这就记住6个了,还剩两个转换流名字比较特殊,需要着重记一下(转换流:字节和字符的组合,所以起名字叫InputS ...

随机推荐

  1. iOS 中Block以及Blocks的使用,闭包方法调用

    OC: -(void)dataWithUrl:(NSString*)string AndId:(NSInteger)id returnName:(void(^)(NSString*name))back ...

  2. ubuntu14.04 解决屏幕亮度无法调节的问题

    sudo gedit /etc/default/grub 在打开文件中找到 GRUB_CMDLINE_LINUX="" 改成 GRUB_CMDLINE_LINUX="ac ...

  3. 转:Siri之父:语音交互或将主导未来十年发展

    http://zhinengjiaohu.juhangye.com/201709/weixin_5664458.html Siri之父Adam Cheyer认为,语音交互很可能是未来十年内计算技术的一 ...

  4. 虚拟机创建流程中neutron代码分析(一)

    前言: 在openstack的学习当中有一说法就是网络占学习时间的百分之七十.这个说法或许有夸大的成分,但不可否认的是openstack中的 网络是及其重要的部分,并且难度也是相当大.试图通过nova ...

  5. 【WebGL】《WebGL编程指南》读书笔记——第5章

    一.前言        终于到了第五章了,貌似开始越来越复杂了. 二.正文         Example1:使用一个缓冲区去赋值多个顶点数据(包含坐标及点大小) function initVerte ...

  6. IT服务(运维)管理实施的几个要点--序言

    IT服务(运维)管理(不是IT运维技术)是IT行业当中相对比较"窄"的一个分支,通常只被金融.电信等大型数据中心的中高层管理人员所关注.但是根据笔者多年从事IT服务和服务管理的经验 ...

  7. SQL数据库语句

    on xxx --主文件 ( name=‘xxxx’, fliename='里面写文件放的路径\xxxx.mdf', size=xxMB, filegrowth=xxMB, maxsize=xxMB ...

  8. Collection源码图

    java基础是否扎实,在于多读源码,比如集合 IO Socket 多线程并发包等 最近将集合框架的源码读了以下,总结了一些,下图所示

  9. Windows 7下将Tomcat Java程序设置为Windows Service

    可以参看以下资料: https://jingyan.baidu.com/article/b2c186c89f5127c46ef6ff08.html http://tomcat.apache.org/t ...

  10. JavaScript的DOM编程--07--节点的属性

    节点的属性: 1). nodeName: 代表当前节点的名字. 只读属性. 如果给定节点是一个文本节点, nodeName 属性将返回内容为 #text 的字符串 2). nodeType:返回一个整 ...