zoukankan      html  css  js  c++  java
  • 重温设计模式系列(二)面向对象基础知识

    本文摘要

    文章介绍了面向对象的基础知识,对象,类,抽象,接口等基本概念,面向对象的三大特征以及UML类图的基础知识,作为后续文章的基础。

    名词解释

    1、抽象:一种思维方式,把具体事物的简单化,概括性描述。

    2、UML:通用建模语言

    1、对象和类

    1.1 对象

    在面向对象的世界里,万物皆是对象,动物是对象,植物是对象,对象的本质是什么呢?对象是一个真实存在的事物。比如一个杯子,一碗水都是对象。

    用对象的方式描述事物,与面向过程方式来讲,更容易理解,更符合人们的思维习惯。

    1.2 类

    类是对象的抽象,比如一只小狗,一只小猫,他们的抽象是动物类,也就是说一只小狗,一只小猫是属于动物的一类。

    1.3 类与对象的关系

    类是对象的抽象,对象是类的实例。一个类可以有多个对象,但一个对象可能只属于一个类。在UML中有类图和对象图的概念。示例如下(更多知识,请自我补充):

    1.4 思维过程

    通过各个对象找到其共同点,把相同的对象归为一类,就是面向对象的基本思维过程。比如张三,李四是具体的对象,他们都是人类。因此可以抽象出人这个类。

    1.5 类的构成

    一个类主要有属性和方法(类名,静态块等不展开讲),通称为类的成员,属性表达类的数据部分,方法表示类的行为。比如类Person有name,age等属性,walk(),run()方法。

    1.6 类的几个重要概念

    (1)实例化 :创建一个对象,一般用new的方式。如:Person tom=new Person();

    (2)构造函数:每个类默认有一个公用构造函数,也可以自定义构造函数,一般用于给成员变量赋值或执行一些初始化方法。

    (3)重载:一个方法有多个不同个数,不同类型,不同顺序的参数的方法,称为方法的重载。

    比如:

    public void hello(){}
    public void hell(String name){}
    public void hello(int index){}

    (4)重写:关键字Override,指子类重写(覆盖)父类的方法,用于改变父类方法的行为。一般用于多态实现。

    1.7 接口

    类包含数据或行为,但接口是一种契约,主要定义接口的行为,没有方法体,需要类实现接口。一般用于定义规范(抽象行为)和实现松耦合架构。

    使用方式:

    接口的使用很灵活,可以接口中定义1个或多个方法,一个类可以实现多个接口,但只能继承一个类。

    1.8 抽象类

    抽象类使用abstract定义,一般用于定义多个类共同拥有的代码。抽象类可以定义抽象方法也可以定义方法体。一般在项目中,用于定义公用代码或定义公用结构,比如模版模式。

    2、三大特征

    2.1 封装

    定义:把与自己相关的数据和行为放到一个类中,对外提供且仅提供必要方法。

    解决的问题:隐藏内部细节,提供有限访问接口,使代码内聚,提高易用性

    存在的问题:不同的类中,会有相同代码,代码冗余会多,需要对这些代码进行抽象设计

    2.2 继承

    定义:是一种父子关系,子类继承父类的公有和受保护作用域代码,可以重写父类代码,也可以自定义自己的代码。继承表达的是一种is a的关系。

    类图:

    解决的问题:代码复用问题,子类复用父类代码,减少代码量,提高可维护性。

    存在的问题:

    1、父类增加的任何公有或受保护方法都被子类继承,会导致子类有其不需要的行为。

    2、继承关系,如果不进行控制,会造成多级继承,当某一父类修改后,影响子类的调用(很容易搞错,是不是该子类应该拥有的)。影响代码的可维护性。

    2.3 多态

    定义:一个接口有多种不同的实现

    解决的问题:屏蔽了各类之间的差异,方便写出通用性强的逻辑,提高代码的灵活性和扩展性。

    存在的问题:

    1、实现类需要遵循接口的行为约定,否则会出现不匹配的情况。比如:eat()方法原来的意图是定义吃的逻辑,实现时写成了play的逻辑。

    2、增加了代码和维护的复杂性。

    3、类之间的关系

    3.1 泛化关系

    泛化是特殊/一般的关系,一般是指继承关系,用于定义父子关系。

    3.2 关联关系

    类与类之间有一种引用关系,一般有依赖,聚合,组合三种关系。

    依赖:一种需要,比如人需要空气,这就是一种依赖。

    聚合:一种弱拥有关系(整体与部分的关系),但是两者的生命周期不同,大雁与雁群的关系,就是一种聚合关系。

    组合:一种强拥有关系(整体与部分的关系),两者的生命周期相同,比如车与发动机的关系,发动起报废了,车也就报废了。

    3.3 高内聚,松耦合

    高内聚:是指类内部元素之间的关系,好的内聚是具备良好的封装性,指类内部的数据和行为有且仅是其拥有的,对外只提供必要的访问接口你。一般好的内聚性,更利于维护和复用,只要接口不变,内部如何变化都不需要客户端变。

    松耦合:是指类与类之间的关系,好的耦合应该是尽量少的依赖,如果没必要就不产生依赖。一般设计中,采用聚合组合或依赖接口而不是依赖具体实现,隔离这种变化。比如继承,实际上就是一种强耦合关系,如果解决这种耦合,可以采用聚合组合的方式。也就是设计原则中的合成复用原则(后面讲设计原则时会具体讲)

    4、面向对象的一般过程

    (1)找对象

    (2)抽象类

    (3)定义类属性

    (4)定义类关系

    (5)设计检查

    5、UML类图

    5.1基本元素

    (1)类图

    类图包含类的名称、属性和方法定义。

    类的可见性修饰符:

    # protected

    无修饰符为 internal

    (2)接口

    一般只定义接口方法。

    5.2元素关系

    (1)关联

    A 和 B 相互调用和访问对方的元素。

    (2)依赖

    B 的变化会影响 A,则 A 依赖于 B。

    (3)聚合

    A 中拥有一个 B,但 B 脱离于 A 仍然可以独立存活。

    (4)组合

    A 中拥有一个 B,B和A属于同一生命周期,B 脱离 A 后在系统中没有任何存活的意义。

    (5)泛化

    泛化是一种继承关系,可以是类继承或接口继承。

    (6)实现

    接口和实现类之间的关系。

     

    下篇预告

    重温设计模式系列(三)面向对象设计原则

    摘要:比设计模式更重要的是设计思想和设计原则,基于这些原则,逐步产生了不同的设计模式。因此,学好设计模式的基础是掌握基本的设计原则。大纲如下:

    1、代码抽象三原则

    2、GRASP原则

    3、SOLID原则

    4、SOC原则

  • 相关阅读:
    游标cursor
    SQL: EXISTS
    LeetCode Reverse Integer
    LeetCode Same Tree
    LeetCode Maximum Depth of Binary Tree
    LeetCode 3Sum Closest
    LeetCode Linked List Cycle
    LeetCode Best Time to Buy and Sell Stock II
    LeetCode Balanced Binary Tree
    LeetCode Validate Binary Search Tree
  • 原文地址:https://www.cnblogs.com/itfly8/p/14022145.html
Copyright © 2011-2022 走看看