📜  OOAD-面向对象的系统(1)

📅  最后修改于: 2023-12-03 15:03:22.568000             🧑  作者: Mango

OOAD-面向对象的系统

面向对象的系统是一种具有可重用性、可维护性、可扩展性、可靠性和高内聚低耦合性的软件系统。面向对象的系统开发方法是一种基于面向对象技术的软件开发方法,它以对象为中心,重视抽象、封装、继承和多态特性。本文将介绍面向对象的系统开发方法,包括对象模型、UML建模、软件开发流程和设计模式等方面。

对象模型

对象模型是面向对象系统的核心,它定义了系统中的对象、对象之间的关系和对象的属性和行为。对象模型可以理解为一张图或者一组类的定义,其中每一个类代表一个概念或者实体,每一个对象代表一个具体的实例。对象模型由类、对象、属性和方法四个部分组成。

类是一种抽象的数据类型,它封装了对象的属性和方法。类是对象模型中的基本构建块,它描述了对象共有的属性和行为。类的定义包括类名、属性和方法。类可以继承、实现接口和泛化。

对象

对象是类的一个实例,拥有类的所有属性和方法。每个对象具有唯一的标识符和状态。对象之间的交互是通过方法调用实现的。对象的创建和销毁是由程序员手动管理的。

属性

属性是类中的变量,描述了对象的状态。属性可以是公有的、私有的或受保护的。公有属性可以被所有对象访问,私有属性只能被对象本身访问,受保护属性可以被类及其子类访问。

方法

方法是类中的函数,描述了对象的行为。方法可以是公有的、私有的或受保护的。公有方法可以被所有对象调用,私有方法只能被对象本身调用,受保护方法可以被类及其子类调用。

UML建模

UML(Unified Modeling Language,统一建模语言)是一种用于描述、构建和设计系统的语言。UML提供了多种图形符号和建模工具,可以帮助开发人员更好地理解和描述软件系统。UML建模包括用例图、类图、时序图、活动图等。

用例图

用例图是系统用例的图形表示,它用于描述系统的功能和用例之间的关系。用例图包括用例、系统边界、参与者和关系等元素。

@startuml
left to right direction
rectangle "系统边界" {
  actor 参与者
  rectangle "用例1" {
    参与者 -> (用例1)
  }
  rectangle "用例2" {
    参与者 --> (用例2)
  }
}
@enduml
类图

类图是描述系统中类以及它们之间的关系的图形表示。类图包括类、接口、继承、实现、关联、聚合、组合和依赖等元素。

@startuml
class 类1 {
  -属性1
  +方法1()
}
interface 接口1 {
  +方法2()
}
class 类2 {
  +方法3()
}

类1 --> 类2 : 关联
类1 --> 接口1 : 实现
@enduml
时序图

时序图是描述系统中对象之间消息传递的图形表示。时序图包括对象、生命线和消息等元素。

@startuml
object 对象1
object 对象2

对象1 -> 对象2 : 消息1
对象2 --> 对象1 : 消息2
@enduml
活动图

活动图是描述系统中活动流程的图形表示。活动图包括活动、分支、合并、决策、循环等元素。

@startuml
start
if (条件1) then (true)
  :分支1;
  if (条件2) then (true)
    :分支2;
  else (false)
    :分支3;
  endif
  :合并1;
else (false)
  :分支4;
endif
while (条件3)
  :循环1;
endwhile
stop
@enduml
软件开发流程

软件开发流程是指从需求分析到系统交付的一系列过程。常用的软件开发流程有瀑布模型、迭代模型、增量模型、螺旋模型和敏捷开发等。

瀑布模型

瀑布模型是一种线性的开发流程,它将软件开发过程分为需求分析、设计、编码、测试和维护等阶段。每个阶段的完成必须等待前一个阶段的完成。瀑布模型适用于需求稳定、开发团队人员丰富、项目周期较长的情况。

迭代模型

迭代模型是将软件开发流程分为多个迭代周期进行开发的模型。每个迭代周期包括需求分析、设计、编码、测试和维护等阶段,每个迭代周期需要完成一部分可用的系统功能。迭代模型适用于需求不稳定、团队交流较好、项目周期较短的情况。

增量模型

增量模型是将软件开发过程分为多个增量阶段进行开发的模型。每个增量阶段包括需求分析、设计、编码、测试和维护等阶段,每个增量阶段需要完成特定的系统功能。增量模型适用于需求不稳定、团队合作较好、项目周期较长的情况。

螺旋模型

螺旋模型是一种风险驱动的软件开发模型,它将风险管理贯穿于软件开发流程的各个阶段。螺旋模型包括计划阶段、风险评估阶段、工程实现阶段和评审阶段等。

敏捷开发

敏捷开发是一种适应性开发方法,它强调快速适应需求变化、迅速交付可用的软件系统。敏捷开发方法包括Scrum、XP(Extreme Programming)、FDD(Feature-Driven Development)等。

设计模式

设计模式是面向对象开发中的重要思想,它是对代码编写过程中经常遇到的问题的反复总结和抽象,是一种可重复使用的解决方案。设计模式分为创建型、结构型和行为型三类,包括单例模式、工厂模式、适配器模式、观察者模式等。

### 单例模式

单例模式是保证一个类只有一个实例的模式。单例模式可以防止其他对象对该实例进行实例化,保证了每次都获得同一个实例。单例模式适用于需要全局唯一对象的应用场景。

```java
public class Singleton {
  private static Singleton instance;
 
  private Singleton() {}
 
  public static Singleton getInstance() {
    if (instance == null) {
      instance = new Singleton();
    }
    return instance;
  }
}
工厂模式

工厂模式是提供创建对象的接口,但是对象的创建由实现工厂的类来决定的模式。工厂模式将对象的创建和使用分离,增加了系统的灵活性。工厂模式包括简单工厂模式、工厂方法模式和抽象工厂模式。

public interface Shape {
  void draw();
}

public class Circle implements Shape {
  public void draw() {
    System.out.println("Inside Circle::draw() method.");
  }
}

public class Rectangle implements Shape {
  public void draw() {
    System.out.println("Inside Rectangle::draw() method.");
  }
}

public class ShapeFactory {
  public Shape getShape(String shapeType){
    if(shapeType == null){
      return null;
    }        
    if(shapeType.equalsIgnoreCase("CIRCLE")){
      return new Circle();
    } 
    else if(shapeType.equalsIgnoreCase("RECTANGLE")){
      return new Rectangle();
    }
    return null;
  }
}
适配器模式

适配器模式是将一个类的接口转换成客户希望的另一个接口的模式。适配器模式可以将原本不兼容的两个接口进行兼容。适配器模式可以分为类适配器模式和对象适配器模式。

public interface MediaPlayer {
  void play(String audioType, String fileName);
}

public interface AdvancedMediaPlayer {	
  void playVlc(String fileName);
  void playMp4(String fileName);
}

public class VlcPlayer implements AdvancedMediaPlayer{
  public void playVlc(String fileName) {
    System.out.println("Playing vlc file. Name: "+ fileName);		
  }
  public void playMp4(String fileName) {
    // do nothing
  }
}

public class Mp4Player implements AdvancedMediaPlayer{
  public void playVlc(String fileName) {
    // do nothing
  }
  public void playMp4(String fileName) {
    System.out.println("Playing mp4 file. Name: "+ fileName);		
  }
}

public class MediaAdapter implements MediaPlayer {
  AdvancedMediaPlayer advancedMusicPlayer;

  public MediaAdapter(String audioType){
    if(audioType.equalsIgnoreCase("vlc") ){
      advancedMusicPlayer = new VlcPlayer();			
    } else if (audioType.equalsIgnoreCase("mp4")){
      advancedMusicPlayer = new Mp4Player();
    }	
  }

  public void play(String audioType, String fileName) {
    if(audioType.equalsIgnoreCase("vlc")){
      advancedMusicPlayer.playVlc(fileName);
    }else if(audioType.equalsIgnoreCase("mp4")){
      advancedMusicPlayer.playMp4(fileName);
    }
  }
}

public class AudioPlayer implements MediaPlayer {
  MediaAdapter mediaAdapter; 

  public void play(String audioType, String fileName) {    
    if(audioType.equalsIgnoreCase("mp3")){
      System.out.println("Playing mp3 file. Name: " + fileName);         
    } else if(audioType.equalsIgnoreCase("vlc") || audioType.equalsIgnoreCase("mp4")){
       mediaAdapter = new MediaAdapter(audioType);
       mediaAdapter.play(audioType, fileName);
    } else{
      System.out.println("Invalid media. " + audioType + " format not supported");
    }
  }   
}
观察者模式

观察者模式是一种依赖于事件的模式,它将一个对象与多个观察者进行关联,当对象状态发生改变时,会自动通知所有观察者进行更新。观察者模式可以实现松散耦合,当一个对象的状态改变时,仅通知需要了解该对象状态的观察者。观察者模式适用于多个对象之间存在一对多的依赖关系的情况。

public interface Observer {
  void update(float temp, float humidity, float pressure);
}

public interface Subject {
  void registerObserver(Observer o);
  void removeObserver(Observer o);
  void notifyObservers();
}

public class WeatherData implements Subject {
  private ArrayList<Observer> observers;
  private float temperature;
  private float humidity;
  private float pressure;

  public WeatherData() {
    observers = new ArrayList<Observer>();
  }

  public void registerObserver(Observer o) {
    observers.add(o);
  }

  public void removeObserver(Observer o) {
    int i = observers.indexOf(o);
    if (i >= 0) {
      observers.remove(i);
    }
  }

  public void notifyObservers() {
    for (Observer observer : observers) {
      observer.update(temperature, humidity, pressure);
    }
  }

  public void measurementsChanged() {
    notifyObservers();
  }

  public void setMeasurements(float temperature, float humidity, float pressure) {
    this.temperature = temperature;
    this.humidity = humidity;
    this.pressure = pressure;
    measurementsChanged();
  }
}

public class CurrentConditionsDisplay implements Observer {
  private float temperature;
  private float humidity;
  private Subject weatherData;

  public CurrentConditionsDisplay(Subject weatherData) {
    this.weatherData = weatherData;
    weatherData.registerObserver(this);
  }

  public void update(float temp, float humidity, float pressure) {
    this.temperature = temp;
    this.humidity = humidity;
    display();
  }

  public void display() {
    System.out.println("Current conditions: " + temperature + "F degrees and " 
        + humidity + "% humidity");
  }
}