객체지향 원칙을 사용하여 주차장을 설계하려면 시스템을 실제 엔터티를 반영하는 클래스 속성과 메서드로 분해해야 합니다. 차량 및 주차 공간과 같은 주요 구성 요소는 객체로 모델링될 수 있으며 주차와 같은 상호 작용은 메서드를 통해 처리될 수 있습니다. 이 접근 방식은 모듈성 재사용성과 유지 관리성을 촉진하여 시스템을 쉽게 확장하고 관리할 수 있게 해줍니다.
객체 지향 원칙을 사용하여 주차장을 설계하는 방법은 무엇입니까?가정
지금은 우리의 목적을 위해 다음과 같은 가정을 할 것입니다. 우리는 너무 많은 것을 추가하지 않고도 문제에 약간의 복잡성을 추가하기 위해 이러한 구체적인 가정을 세웠습니다.
네트워크 및 네트워크 유형
- 주차장은 여러 층으로 이루어져 있습니다. 각 레벨에는 여러 줄의 지점이 있습니다.
- 주차장에는 오토바이, 자동차, 버스를 주차할 수 있습니다.
- 주차장에는 오토바이 주차공간이 소형 주차공간과 대형 주차공간이 있습니다.
- 오토바이는 어느 곳에나 주차할 수 있습니다.
- 자동차는 하나의 작은 공간이나 하나의 넓은 공간에 주차할 수 있습니다.
- 버스는 같은 줄에 연속적으로 있는 5개의 넓은 공간에 주차할 수 있습니다. 좁은 공간에는 주차할 수 없습니다. 아래 구현에서는 Car Bus와 Motorcycle이 상속되는 추상 클래스 Vehicle을 만들었습니다.
객체지향 디자인
먼저 필요한 클래스를 만들고 각 클래스에 명확한 단일 책임이 있는지 확인합니다. 각 클래스와 메서드가 상호 작용하는 방식에 초점을 맞춰 디자인을 분석해 보겠습니다.
1. 차량 등급
그만큼Vehicle클래스는 모든 유형의 차량에 대한 공통 속성과 동작을 정의합니다. 다음과 같은 보다 구체적인 차량 유형의 기본 클래스 역할을 합니다.Bus Car그리고Motorcycle.
public abstract class Vehicle { protected String licensePlate; protected int spotsNeeded; protected VehicleSize size; public Vehicle(String licensePlate VehicleSize size) { this.licensePlate = licensePlate; this.size = size; this.spotsNeeded = (size == VehicleSize.Large) ? 5 : 1; } public int getSpotsNeeded() { return spotsNeeded; } public VehicleSize getSize() { return size; } public String getLicensePlate() { return licensePlate; } public abstract boolean canFitInSpot(ParkingSpot spot); }
2. 콘크리트 차량 강습
버스 : 버스는 5개의 연속된 대형 공간이 필요합니다.
자바스크립트 온클릭Java
public class Bus extends Vehicle { public Bus(String licensePlate) { super(licensePlate VehicleSize.Large); } public boolean canFitInSpot(ParkingSpot spot) { return spot.getSpotSize() == VehicleSize.Large; } }
자동차 : 소형 주차공간과 넓은 주차공간 모두 주차 가능합니다.
Javapublic class Car extends Vehicle { public Car(String licensePlate) { super(licensePlate VehicleSize.Compact); } public boolean canFitInSpot(ParkingSpot spot) { return spot.getSpotSize() == VehicleSize.Compact || spot.getSpotSize() == VehicleSize.Large; } }
오토바이 : 오토바이는 어느 곳에나 주차 가능
Javapublic class Motorcycle extends Vehicle { public Motorcycle(String licensePlate) { super(licensePlate VehicleSize.Motorcycle); } public boolean canFitInSpot(ParkingSpot spot) { return true; // Can park in any spot } }
3. ParkingSpot 클래스
그만큼ParkingSpot클래스는 주차장의 개별 주차 공간을 나타냅니다. 가용성을 관리하고 특정 차량이 그 자리에 들어갈 수 있는지 확인하는 역할을 담당합니다.
- ParkingSpot에서 상속받은 LargeSpot CompactSpot 및 MotorcycleSpot에 대한 클래스를 사용하여 이를 구현할 수도 있었지만 이는 아마도 과잉일 것입니다.
- 반점은 크기 외에는 다른 동작을 갖지 않을 수 있습니다.
public class ParkingSpot { private Vehicle vehicle; private VehicleSize spotSize; private int row; private int spotNumber; private Level level; public ParkingSpot(Level level int row int spotNumber VehicleSize spotSize) { this.level = level; this.row = row; this.spotNumber = spotNumber; this.spotSize = spotSize; this.vehicle = null; } public boolean isAvailable() { return vehicle == null; } public boolean canFitVehicle(Vehicle vehicle) { return isAvailable() && vehicle.canFitInSpot(this); } public void parkVehicle(Vehicle vehicle) { if (canFitVehicle(vehicle)) { this.vehicle = vehicle; } } public void removeVehicle() { this.vehicle = null; } public VehicleSize getSpotSize() { return spotSize; } public int getRow() { return row; } public int getSpotNumber() { return spotNumber; } }
4. ParkingLevel 클래스
그만큼Level클래스는 주차장의 레벨을 나타냅니다. 주차 공간 모음을 관리하고 차량을 주차하고 제거하는 방법을 제공합니다.
노트북 삽입 키Java
public class Level { private int levelNumber; private ParkingSpot[] spots; public Level(int levelNumber int numSpots) { this.levelNumber = levelNumber; this.spots = new ParkingSpot[numSpots]; } public boolean parkVehicle(Vehicle vehicle) { for (ParkingSpot spot : spots) { if (spot.canFitVehicle(vehicle)) { spot.parkVehicle(vehicle); return true; } } return false; } public boolean removeVehicle(Vehicle vehicle) { for (ParkingSpot spot : spots) { if (spot.isOccupied() && spot.getVehicle().equals(vehicle)) { spot.removeVehicle(); return true; } } return false; } }
5. ParkingLot 클래스
그만큼ParkingLot클래스는 전체 주차장을 나타냅니다. 여러 레벨을 관리하고 주차장에서 차량을 주차하고 제거하는 방법을 제공합니다.
public class ParkingLot { private Level[] levels; public ParkingLot(int numLevels int numSpotsPerLevel) { levels = new Level[numLevels]; for (int i = 0; i < numLevels; i++) { levels[i] = new Level(i numSpotsPerLevel); } } public boolean parkVehicle(Vehicle vehicle) { for (Level level : levels) { if (level.parkVehicle(vehicle)) { return true; } } return false; // Parking failed (no spots available) } public boolean removeVehicle(Vehicle vehicle) { for (Level level : levels) { if (level.removeVehicle(vehicle)) { return true; } } return false; // Removal failed (vehicle not found) } }
6. 티켓 및 PaymentService 클래스
발권 및 결제를 관리하기 위해 다음을 추가합니다.Ticket그리고PaymentService수업.
티켓 등급 : 차량 주차 시 발행되는 티켓을 의미합니다. 차량이 주차장에 들어오고 나가는 시간을 기록합니다.
Javapublic class Ticket { private Vehicle vehicle; private Date issueTime; private Date exitTime; public Ticket(Vehicle vehicle) { this.vehicle = vehicle; this.issueTime = new Date(); } public void setExitTime(Date exitTime) { this.exitTime = exitTime; } public long getDuration() { return (exitTime.getTime() - issueTime.getTime()) / 1000; // Time in seconds } }
PaymentService 클래스 : 주차요금 정산 및 결제 처리를 담당합니다.
자바공공의 수업 결제서비스 { 공공의 더블 계산수수료(표 표) { 긴 지속 = 표.getDuration(); // 단순 수수료 모델: `text`=