Descargar la presentación
La descarga está en progreso. Por favor, espere
1
Diseño y Programación Orientada a Objetos
Conferencia # 10: Caso de estudio integrador: Monitoreo de flotas con GPS Facultad Ing. Informática ISPJAE
2
Contenidos que se integran
Encapsulamiento Herencia Polimorfismo Clases genéricas
3
Un sistema para el monitoreo de flotas con tecnología GPS (Global Position System) debe monitorear vehículos de transporte aéreo, terrestre y submarino. Los vehículos tendrán instalado un dispositivo para la transmisión y recepción del GPS.
4
Desde la central de monitoreo se conoce la posición geográ-fica actual (latitud y longitud) de cualquier vehículo, así co-mo la profundidad si se trata de un vehículo submarino y la altura si se trata de uno aéreo.
5
Todos los vehículos se identifican en la central por un código y deben seguir la ruta planificada.
La ruta se expresa a través de una colección de posiciones geográficas y el centro de operaciones la informa tanto al vehículo como a la central de monitoreo.
6
El sistema debe chequear la posición de los vehículos para saber si se mantienen en ruta. Cuando se detecta que un vehículo no se mantiene en la ruta se emite una señal de alarma.
7
Un vehículo está fuera de ruta si su posición actual difiere en 10 o más unidades de todas las posiciones de la ruta o si: Aéreo: excedió los límites de altura Submarinos: excedió los límites de profundidad Terrestre: posición actual no ha cam-biado con respecto a la anterior.
8
Todo el tratamiento por software de los dispositivos de alarma ha sido encapsulado en una clase denominada Alarm. Se ha creado un componente GPS para encapsular el tratamiento del GPS.
9
Métodos del componente GPS:
public Position getPosition( String code, FLOAT value) String code) value: valor de profundidad o altura según tipo de vehículo
10
La Central de Monitoreo, antes de iniciar el monitoreo de un vehículo, valida que la ruta programada por el Centro de Operaciones sea correcta, o sea, que la distancia entre dos puntos consecutivos no sea mayor de 20 unidades.
11
Dos posiciones consecutivas
P1(x1,y1) y P2(x2,y2) Distancia (teorema de Pitágoras) D2 = (y2 - y1)2 + (x2 - x1)2
12
Diseños de clases
13
SubmarineV AerialV TerrestrialV - deep - height - previousPos
Vehicle - String code # Position pos ArrrayList<Position> route SubmarineV - deep - limitDeep AerialV - height - minHeight - maxHeight TerrestrialV - previousPos
14
GPS +getPosition(String) +getPosition(String,Float) Central 1 Alarm +activate(String) Position -latitude -longitude +distance(Position) 0..* 1 0..* Vehicle 1 1
15
Implementación en Java
public class Position { private float latit; private float long; public Position(float latit,float long) { this.latit= latit; this.long= long; }
16
public float getLatit() { return latit; } public float getLong() { return long;
17
public float distance(Position p) { float result, c1, c2; c1= p
public float distance(Position p) { float result, c1, c2; c1= p.getLatit() – latit; c2= p.getLong() – long; result = Math.sqrt(c1*c1 + c2*c2); return result; }
18
public class Vehicle { private String code; protected Position pos; private ArrayList<Position> route; public Vehicle(String code, Position pos) { this.code = code; this.pos = pos; route = null;} …
19
public void update(Position pos) {
this.pos = pos; } public String getCode() {…} public Position getPos() {…} public ArrayList<Position> getRoute() {…}
20
public boolean setRoute( ArrayList<Position> r) {
int i= 0; boolean result= true; while (i < r.size() - 1 && result) if(r.get(i).distance(r.get(i+1)) > 20) result= false; else i++; if (result) route= r; else route= null; return result; }
21
public boolean inRoute() {
int i = 0; boolean result= false; while(i < route.size() && !result) if(pos.distance(route.get(i)) < 10) result= true; else i ++; return result; } …}
22
public class TerrestrialV extends
Vehicle { private Position previousPos; public TerrestrialV(String code, Position pos) { super(code, pos); previousPos= null; } public Position getPreviousPos(){..}
23
public void update(Position pos) {
previousPos= this.pos; super.update(pos); } public boolean inRoute() { return super.inRoute() && pos.distance(previousPos) != 0 ? true : false;
24
public class AerialV extends Vehicle
{ private float height; private float minHeight; private float maxHeight;
25
public AerialV(String code,
Position pos, float height, float minHeight, float maxHeight) { super(code, pos); this.height = height; this.minHeight = minHeight; this.maxHeight = maxHeight; }
26
public float getHeight() {…}
public float getMinHeight() {…} public float getMaxHeight() {…} public boolean inRoute(){ return (super.inRoute() && height >= minHeight && height <= maxHeight)? true : false; }
27
public class SubmarineV extends Vehicle {
private float deep; private float limitDeep;
28
public SubmarineV(String code,
Position pos, float deep, float limitDeep) { super(code, pos); this.deep= deep; this. limitDeep= limitDeep; }
29
public float getDeep()
public float getLimitDeep() public boolean inRoute(){ return (super.inRoute() && deep <= limitDeep)? true : false; }
30
Variantes de implementación
VehicleCollection Variantes de implementación 1ra: Clase derivada de ArrayList 2da: Clase compuesta por una instancia de ArrayList
31
ArrayList<Vehicle>
1ra Variante VehicleCollection ArrayList<Vehicle>
32
ArrayList<Vehicle>
2da Variante VehicleCollection 1 1 ArrayList<Vehicle>
33
Implementación 1ra Variante
public class VehicleCollection extends ArrayList<Vehicle> { public VehicleCollection() { super(); }
34
public boolean addTerrestrial(String c, Position p, ArrayList<Position> r) {
boolean result= false; if(find(c) == null) { TerrestrialV v=new TerrestrialV(c,p); if (v.setRoute(r)) result= add(v); } return result; }
35
public boolean addSubmarine(…)
{…} public boolean addAer(…) {..}
36
public boolean addVehicle(Vehicle v) {
boolean result= false; if (find(v.getCode()) == null && v.getRoute() != null) result= add(v); return result; }
37
public boolean addVehicle(Vehicle v,
ArrayList<Position> r) { boolean result= false; if (find(v.getCode()) == null && v.setRoute(r)) result= add(v); return result; }
38
public Vehicle find(String code) {
int i=0; boolean found= false; while ( i < size() && !found) { found= get(i).getCode() equalsIgnoreCase(code); i++; } return found? get(i-1) : null; }
39
public boolean inRoute(String code)
{ boolean result= false; Vehicle v= find(code); if (v != null) result= v.inRoute(); return result; }
40
ArrayList<Vehicle>
2da Variante VehicleCollection ArrayList<Vehicle> 1
41
Implementación public class VehicleCollection {
private ArrayList<Vehicle> vehicles; public VehicleCollection() { vehicles= new ArrayList<Vehicle> (); }
42
public boolean add(Vehicle v) {
boolean result= false; if(find(v.getCode()) == null && v.getRoute() != null) result= vehicles.add(v); return result; }
43
public boolean add(Vehicle v,
ArrayList<Position> r) { boolean result= false; if (find(v.getCode()) == null && v.setRoute(r)) result= vehicles.add(v); return result; } …
44
Patrón de Diseño. Solución efectiva y reutilizable que se da a un problema de diseño no trivial. Se nombran. Efectiva: resuelve el problema de manera satisfactoria. Reutilizable: se puede aplicar siempre que se presente el mismo problema.
45
Patrón de Diseño: Singleton
Problema: garantizar la existencia de un solo objeto de una cierta clase y accederlo fácilmente. Ejemplo: ¿Cuántos objetos de clase controladora se necesitan en una aplicación? 1
46
Patrón de Diseño: Singleton
Solución: hacer que sea la propia clase la responsable de controlar la existencia de un solo objeto. ¿Cómo?
47
public class Central { private static Central central = null; private GPS gps; private VehicleCollection vehicles; private Alarm alarm; …
48
private Central() { vehicles= new VehicleCollection(); gps= null; alarm= null; } public static Central getInstance() { if (central == null) central = new Central(); return central;
49
public void setGPS(GPS gps) {
this.gps= gps; } public void setAlarm(Alarm alarm) { this.alarm= alarm; …
50
public boolean inRoute(String code) { return vehicles.inRoute(code); }
public boolean addV(Vehicle v) return vehicles.add(v); …
51
Conclusiones Dos variantes para implementar clases contenedoras concretas. Cada una requiere implementa-ciones distintas. ACollection ArrayList<A> 1 ACollection ArrayList<A>
52
Conclusiones Singleton es un patrón de diseño que garantiza trabajar con una única instancia de cierta clase: public class A{ private static A a = null; private A(){…} public static A getInstance(){…}
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.