文章目录
- 前言
- 一、面向对象要解决的问题
- 1、 软件重用性差
- 2、软件可维护性差
- 3、不能满足用户需求
- 二、面向对象的基本概念
- 三、面向对象的特征
- 四、面向对象的要素
- 五、面向对象的开发方法
- 六、面向对象的模型
- 1、对象模型
- 2、动态模型
- 3、功能模型
- 总结
- 1、鸭子抽象类
- 2、鸭子类
- 3、鸭子动作的抽象接口
- 4、不同的飞和不同的叫的实现
- 5、运行效果
- 6、完整代码
前言
面向对象的本质
:通过对象之间的协作完成功能。
面向对象的特点
:采用封装、继承、多态和抽象等设计方法。
面向过程和面向对象开发中,在分析问题
上的不同:
- 面向过程:拿到问题分析问题如何解决的步骤;
- 面向对象:拿到问题分析问题中有哪些类,类的属性与方法,类与类之间的关系。
- 面向对象遵循:合适的方法应该出现在合适的类中。
一、面向对象要解决的问题
1、 软件重用性差
重用性是在不经过修改或稍加修改就可反复使用的特性。软件重用性是软件工程追求的目标之一。
2、软件可维护性差
在软件开发过程中,始终强调软件的可读性、可修改性、可测试性是软件的重要质量指标。
3、不能满足用户需求
传统结构化方法开发的软件,在需求动态变化时,无法满足用户需求变化的情况。
二、面向对象的基本概念
基本概念 | 说明 |
---|---|
对象 | 万物皆可对象,一个整数或一架飞机,一个人,还可表示抽象的规则、事件等 |
对象的状态和行为 | 对象的状态就是属性,属性就是一个值,行为就是对象的操作或动作 |
类 | 类是相同或相似对象的抽象,对象的抽象是类,类的具体化(实例化)是对象 |
类的结构 | 客观世界中各类有结构一样,软件中类也有结构。一般有组合(平行)与聚合结构(部分构成主体) |
消息和方法 | 对象之间进行通信(交互)的信息称为消息,发送消息要指定接收的对象,对象中的执行方法名 |
三、面向对象的特征
基本概念 | 说明 |
---|---|
封装 | 封装就是在抽象出来的类中,将类对象具有的状态(属性)和行为(方法)放在同一个类中,避免外界任意修改类结构和数据,只向外提供修改内部私有数据的接口 |
继承 | 如果有几个类比较类似,就可以把这些类抽象出一个基类作为父类,子类共享父类的属性和方法,并可以增加新的属性和方法 |
多态 | 一条消息发送到不同的对象,不同的对象产生了不同的结果【如消息传播机制】 |
四、面向对象的要素
基本概念 | 说明 |
---|---|
抽象 | 先根据已有的对象分类,抽象出有哪些类,根据具有贤属性和方法的类去造对象 |
封装性(信息隐藏) | 封装是保证软件有良好模块性的基础,封装降低了对象之间的依赖,使得模块更加清晰 |
共享性 | 类的封装体现了对象的共享类的信息,继承体现了子类对父类的信息共享,多态体现了不同对象对消息的共享 |
强调对象结构而非程序结构 | 以对象及对象建的关系建立整个程序的结构 |
五、面向对象的开发方法
基本概念 | 说明 |
---|---|
基本概念 | 说明 |
---|---|
Booch方法 | 最先提出软件开发方法问题,指出面向对象的软件设计不同于传统的功能分解,在于对现实世界的抽象,并将其映射在软件中 |
Coad方法 | 进一步体现了类和类层次结构的认定 |
OMT方法 | “面对对象的建模与设计” |
UML(Unified Modeling Language)语言 | 最重要的成果之一就是统一建模语言(UML)的出现,UML是面向对象技术领域占主导地位的标准化建模语言 |
六、面向对象的模型
1、对象模型
对象模型描述了系统的静态结构,从客观世界对象的关系角度出发,描述在系统中对象之间的关系。主要关心对象的结构、属性、操作,是其他模型的基础。
基本概念 | 说明 |
---|---|
对象和类 | (1)对象:对象建模的目的就是描述对象。(2)类:类是对象的抽象,表示了同一类对象。抽象过程增加了模型的归纳能力。(3)属性指对象具有的属性状态值。(4)操作和方法:操作是对象能够实现的动作或行为。方法是抽象类的时候对对象动作的抽象。 |
关联和链 | 关联是类之间的联系,链是对象之间的联系。角色说明类在关联中的功能。受限关联对类之间的关联进行条件限制。关联的多重性通常描述为一或多 |
类的层次结构 | (1)聚集关系是一种整体-部分的关系。(2)一般化关系主要指基类和子类的继承关系。 |
对象模型 | (1)模板:模板是类、关联、一般化结构的逻辑组成。(2)对象模型是由一个或多个模板组成 |
2、动态模型
动态模型描述系统中控制的过程,或者执行的顺序。即数据的转换状态。
基本概念 | 说明 |
---|---|
事件 | 特定时刻发生的某件事 |
状态 | 对象的属性响应事件,到了某一个状态值 |
状态图 | 状态图是一个标准的计算机概念。是有限自动机的图形表示。这里把状态图作为建立动态模型的图形工具。状态图是一种图,用结点表示状态,结点用圆圈表示;圆圈内有状态名,用箭头连线表示状态的转换,上面标记事件名,箭头方向表示转换的方向。 |
3、功能模型
功能模型描述了系统中的计算,即系统由哪些功能组成。即数据的状态转换进行了哪些转换的计算。
功能模型由数张数据流图组成,数据流图由对象、处理、数据流组成。
基本概念 | 说明 |
---|---|
对象 | |
处理 | |
总结
以生产一只鸭子对象为例:
1、鸭子抽象类
要有一只鸭子,就首先要有一只鸭子类。鸭子可能有很多类,所以抽象出一个鸭子抽象类。所有的鸭子类都可以通过继承鸭子抽象类产生一个特定种类的鸭子类。
abstract class Duck
{
public IFlyBehavior flyBehavior;
public IQuackBehavior quackBehavior;
public Duck()
{
}
public abstract void display();
public void performFly()
{
flyBehavior.fly();
}
public void performQuack()
{
quackBehavior.quack();
}
public void swim()
{
Console.WriteLine("All ducks float, even decoys!");
}
}
2、鸭子类
通过继承鸭子抽象类,产生一个特定的鸭子类。继承父类的所有属性与方法,也可产生新的属性和方法。
class ModelDuck : Duck
{
public ModelDuck()
{
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
public override void display()
{
Console.WriteLine("I'm a ModelDuck!\n");
}
}
3、鸭子动作的抽象接口
鸭子可能有飞的动作,叫的动作,飞和叫可能有不同的形式。将飞和叫这两种动作分别抽象出接口类,其中有动作接口函数。
interface IFlyBehavior
{
void fly();
}
interface IQuackBehavior
{
void quack();
}
4、不同的飞和不同的叫的实现
public class FlyWithWinds : IFlyBehavior
{
public void fly()
{
Console.WriteLine("I'm flying!\n");
}
}
public class FlyNoWay : IFlyBehavior
{
public void fly()
{
Console.WriteLine("I can't flying!\n");
}
}
public class Quack : IQuackBehavior
{
public void quack()
{
Console.WriteLine("Quack!\n");
}
}
public class MuteQuack : IQuackBehavior
{
public void quack()
{
Console.WriteLine("<< Silence >>\n");
}
}
public class Squeak : IQuackBehavior
{
public void quack()
{
Console.WriteLine("Squeak!\n");
}
}
5、运行效果
6、完整代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 鸭子模式
{
class Program
{
static void Main(string[] args)
{
Duck ModelDuck1 = new ModelDuck();
ModelDuck1.performFly();
ModelDuck1.performQuack();
ModelDuck1.display();
Console.ReadLine();
}
}
class ModelDuck : Duck
{
public ModelDuck()
{
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
public override void display()
{
Console.WriteLine("I'm a ModelDuck!\n");
}
}
abstract class Duck
{
public IFlyBehavior flyBehavior;
public IQuackBehavior quackBehavior;
public Duck()
{
}
public abstract void display();
public void performFly()
{
flyBehavior.fly();
}
public void performQuack()
{
quackBehavior.quack();
}
public void swim()
{
Console.WriteLine("All ducks float, even decoys!");
}
}
interface IFlyBehavior
{
void fly();
}
public class FlyWithWinds : IFlyBehavior
{
public void fly()
{
Console.WriteLine("I'm flying!\n");
}
}
public class FlyNoWay : IFlyBehavior
{
public void fly()
{
Console.WriteLine("I can't flying!\n");
}
}
interface IQuackBehavior
{
void quack();
}
public class Quack : IQuackBehavior
{
public void quack()
{
Console.WriteLine("Quack!\n");
}
}
public class MuteQuack : IQuackBehavior
{
public void quack()
{
Console.WriteLine("<< Silence >>\n");
}
}
public class Squeak : IQuackBehavior
{
public void quack()
{
Console.WriteLine("Squeak!\n");
}
}
}