设计原则实验总结


实验名称
设计原则。
实验目的
设计并实现符合面向对象设计原则的某一演示系统。
实验类型
设计型。
实验环境
编程环境:Visual Studio Code;
运行环境:Windows 10等。
实验内容
该演示系统分为车、路、人三个抽象类,符合依赖倒置原则;车抽象类分出汽车、公交车两个子类,路分为高速公路、市区街道两个子类,人分为男人、女人两个子类,符合里氏替换原则;每个类下只实现一个功能,符合单一职责原则。人看到路上行驶车,因此路依赖车、人依赖路。
系统类图,如图1所示:

实验运行结果,如图2所示:

实验总结
通过本次实验我对面向对象设计的常用几种原则有了深刻的理解,并且通过模拟一个小的系统实现了单一职责原则、依赖倒置原则、里氏代换原则,为自己写一个可重复利用的良好代码养成了良好的习惯。

代码如下:

// 汽车是一个维度,有多种不同的车型
abstract class AbstractCar {
  abstract run(): void;
}

// 路是一个维度,有多种不同的路
abstract class AbstractRoad {
  car: AbstractCar;
  abstract snapshot(): void;
}

class SpeedRoad extends AbstractRoad {
  constructor(car: AbstractCar) {
    super();
    this.car = car;
  }
  snapshot(): void {
    console.log('在高速公路上');
    this.car.run();
  }
}

class Street extends AbstractRoad {
  constructor(car: AbstractCar) {
    super();
    this.car = car;
  }
  snapshot(): void {
    console.log('在市区街道上');
    this.car.run();
  }
}

class Car extends AbstractCar {
  run(): void {
    console.log('开着小汽车');
  }
}

class Bus extends AbstractCar {
  run(): void {
    console.log('开着公共汽车');
  }
}

function carRunOnRoadDemo(): void {
  // 在高速公路上,开着小汽车
  const car = new Car();
  const speedRoad = new SpeedRoad(car);
  speedRoad.snapshot();

  // 在市区街道上,开着公共汽车
  const bus = new Bus();
  const street = new Street(bus);
  street.snapshot();
}
carRunOnRoadDemo();

/* 人,汽车和路三个维度*/
abstract class Person {
  road: AbstractRoad;
  abstract see(): void;
}

class Man extends Person {
  constructor(road: AbstractRoad) {
    super();
    this.road = road;
  }
  see(): void {
    console.log('男人看到');
    this.road.snapshot();
  }
}

class Woman extends Person {
  constructor(road: AbstractRoad) {
    super();
    this.road = road;
  }
  see(): void {
    console.log('女人看到');
    this.road.snapshot();
  }
}

function personSeeCarOnRoadDemo() {
  // 男人看到 在市区街道上 开着小汽车
  console.log("----------");
  const car = new Car();
  const street = new Street(car);
  const man = new Man(street);
  const woman = new Woman(street);
  man.see();
  woman.see();
}

personSeeCarOnRoadDemo();