Escolar Documentos
Profissional Documentos
Cultura Documentos
Este es el listado de los patrones de diseño más conocidos. Poco a poco iré
escribiendo artículos sobre cada uno de ellos y los iré enlazando aquí. Es un
proceso largo porque son muchos y quiero encontrar la mejor forma de
explicarlos, pero llegará el día en que tengamos aquí un listado completo que te
sirva de referencia.
Los patrones se dividen en distintos grupos según el tipo de problema que
resuelven, a saber:
Patrones creacionales
Son los que facilitan la tarea de creación de nuevos objetos, de tal forma que el
proceso de creación pueda ser desacoplado de la implementación del resto del
sistema.
Los patrones creacionales están basados en dos conceptos:
Encapsular el conocimiento acerca de los tipos concretos que nuestro sistema
utiliza. Estos patrones normalmente trabajarán con interfaces, por lo que la
implementación concreta que utilicemos queda aislada.
Ocultar cómo estas implementaciones concretas necesitan ser creadas y cómo
se combinan entre sí.
Los patrones creacionales facilitan la tarea de creación de nuevos objetos
encapsulando el proceso.
Los patrones creacionales más conocidos son:
Abstract Factory, Factory Method, Builder, Singleton, Prototype
Patrones estructurales
Son patrones que nos facilitan la modelización de nuestros
software especificando la forma en la que unas clases se relacionan con otras.
Los patrones estructurales especifican la forma en que unas clases se relacionan
con otras.
Estos son los patrones estructurales que definió la Gang of Four:
Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy
Patrones de comportamiento
En este último grupo se encuentran la mayoría de los patrones, y se usan
para gestionar algoritmos, relaciones y responsabilidades entre objetos.
Los patrones de comportamiento gestionan algoritmos, relaciones y
responsabilidades entre objetos.
Los patrones de comportamiento son:
Command, Chain of responsibility, Interpreter, Iterator, Mediator, Memento,
Observer, State, Strategy, Template Method, Visitor
1.2 PATRÓNES DE DISEÑO
Patrones Creacionales
Prototipado ( Prototype )
Singleton
Este patrón plantea la separación del problema en tres capas: la capa model,
que representa la realidad; la capa controler , que conoce los métodos y
atributos del modelo, recibe y realiza lo que el usuario quiere hacer; y la
capa vista, que muestra un aspecto del modelo y es utilizada por la capa anterior
para interaccionar con el usuario.
Patrones Estructurales
Patrones De Comportamiento
1.2.3 Aplicaciones
Patrones de interfaces de usuario, esto es, aquellos que intentan definir las
mejores formas de construir interfaces hombre-máquina (véase Interacción
persona-computador, Interfaz gráfica de usuario).
Patrones para la construcción de sistemas empresariales, en donde se
requieren especiales esfuerzos en infraestructuras de software y un nivel de
abstracción importante para maximizar factores como la escalabilidad o el
mantenimiento del sistema.
Patrones para la integración de sistemas (véase Integración de aplicaciones
empresariales), es decir, para la intercomunicación y coordinación de
sistemas heterogéneos.
Patrones de flujos de trabajo, esto es para la definición, construcción e
integración de sistemas abstractos de gestión de flujos de trabajo y procesos
con sistemas empresariales. Véase también BPM.
Ejemplo De La Aplicación De Patrones En Yii2
UNIDAD II CONCURRENCIA DE HILOS
La mayoria del soporte de java proporciona para trabajar con hilos recide en la
clase Theread del paquete java.lang, aunque también la clase Objecto, la
interfaz Runnable,la interfaz Thread.UncaughtExceptionHandler y las clases
ThreadGroup y ThreadLocal del mismo paquete,así como la máquina
virtual,proporcionan algún tipo de soporte.
Nuevo Thread
La siguiente sentencia crea un nuevo hilo de ejecución pero no lo arranca, lo deja
en el estado deNuevo Thread:
Thread MiThread = new MiClaseThread();
Thread MiThread = new Thread( new UnaClaseThread,"hiloA" );
Cuando un hilo está en este estado, es simplemente un objeto Thread vacío. El
sistema no ha destinado ningún recurso para él. Desde este estado solamente
puede arrancarse llamando al método start(), o detenerse definitivamente,
llamando al método stop(); la llamada a cualquier otro método carece de sentido
y lo único que provocará será la generación de una excepción de
tipoIllegalThreadStateException.
Ejecutable
Ahora obsérvense las dos líneas de código que se presentan a continuación:
Thread MiThread = new MiClaseThread();
MiThread.start();
La llamada al método start() creará los recursos del sistema necesarios para que
el hilo puede ejecutarse, lo incorpora a la lista de procesos disponibles para
ejecución del sistema y llama al método run() del hilo de ejecución. En este
momento se encuentra en el estado Ejecutable del diagrama. Y este estado
es Ejecutable y no En Ejecución, porque cuando el hilo está aquí no esta
corriendo. Muchos ordenadores tienen solamente un procesador lo que hace
imposible que todos los hilos estén corriendo al mismo tiempo. Java implementa
un tipo de scheduling o lista de procesos, que permite que el procesador sea
compartido entre todos los procesos o hilos que se encuentran en la lista. Sin
embargo, para el propósito que aquí se persigue, y en la mayoría de los casos,
se puede considerar que este estado es realmente un estado En Ejecución,
porque la impresión que produce ante el usuario es que todos los procesos se
ejecutan al mismo tiempo.
Cuando el hilo se encuentra en este estado, todas las instrucciones de código
que se encuentren dentro del bloque declarado para el método run(), se
ejecutarán secuencialmente.
Parado
El hilo de ejecución entra en estado Parado cuando alguien llama al
método suspend(), cuando se llama al método sleep(), cuando el hilo está
bloqueado en un proceso de entrada/salida o cuando el hilo utiliza su
método wait() para esperar a que se cumpla una determinada condición. Cuando
ocurra cualquiera de las cuatro cosas anteriores, el hilo estará Parado.
Por ejemplo, en el trozo de código siguiente:
Thread MiThread = new MiClaseThread();
MiThread.start();
try {
MiThread.sleep( 10000 );
} catch( InterruptedException e ) {
;
}
la línea de código que llama al método sleep():
MiThread.sleep( 10000 );
hace que el hilo se duerma durante 10 segundos. Durante ese tiempo, incluso
aunque el procesador estuviese totalmente libre, MiThread no correría. Después
de esos 10 segundos. MiThread volvería a estar en estado Ejecutable y ahora sí
que el procesador podría hacerle caso cuando se encuentre disponible.
Para cada una de los cuatro modos de entrada en estado Parado, hay una forma
específica de volver a estado Ejecutable. Cada forma de recuperar ese estado
es exclusiva; por ejemplo, si el hilo ha sido puesto a dormir, una vez transcurridos
los milisegundos que se especifiquen, él solo se despierta y vuelve a estar en
estado Ejecutable. Llamar al método resume() mientras esté el hilo durmiendo
no serviría para nada.
Los métodos de recuperación del estado Ejecutable, en función de la forma de
llegar al estadoParado del hilo, son los siguientes:
Si un hilo está dormido, pasado el lapso de tiempo
Si un hilo de ejecución está suspendido, después de una llamada a su
método resume()
Si un hilo está bloqueado en una entrada/salida, una vez que el comando de
entrada/salida concluya su ejecución
Si un hilo está esperando por una condición, cada vez que la variable que
controla esa condición varíe debe llamarse al método notify() o notifyAll()
Muerto
Un hilo de ejecución se puede morir de dos formas: por causas naturales o
porque lo maten (constop()). Un hilo muere normalmente cuando concluye de
forma habitual su método run(). Por ejemplo, en el siguiente trozo de código, el
bucle while es un bucle finito -realiza la iteración 20 veces y termina-:
public void run() {
int i=0;
while( i < 20 ) {
i++;
System.out.println( "i = "+i );
}
}
Un hilo que contenga a este método run(), morirá naturalmente después de que
se complete el bucle y run() concluya.
También se puede matar en cualquier momento un hilo, invocando a su
método stop(). En el trozo de código siguiente:
Thread MiThread = new MiClaseThread();
MiThread.start();
try {
MiThread.sleep( 10000 );
} catch( InterruptedException e ) {
;
}
MiThread.stop();
se crea y arranca el hilo MiThread, se duerme durante 10 segundos y en el
momento de despertarse, la llamada a su método stop(), lo mata.
El método stop() envía un objeto ThreadDeath al hilo de ejecución que quiere
detener. Así, cuando un hilo es parado de este modo, muere asíncronamente. El
hilo morirá en el momento en que reciba ese objeto ThreadDeath.
Los applets utilizarán el método stop() para matar a todos sus hilos cuando el
navegador con soporte Java en el que se están ejecutando le indica al applet
que se detengan, por ejemplo, cuando se minimiza la ventana del navegador o
cuando se cambia de página.
El método isAlive()
El interfaz de programación de la clase Thread incluye el método isAlive(), que
devuelve true si el hilo ha sido arrancado (con start()) y no ha sido detenido
(con stop()). Por ello, si el métodoisAlive() devuelve false, sabemos que estamos
ante un Nuevo Thread o ante un thread Muerto. Si devuelve true, se sabe que el
hilo se encuentra en estado Ejecutable o Parado. No se puede diferenciar
entre Nuevo Thread y Muerto, ni entre un hilo Ejecutable o Parado.
t1.setPriority(2);
t2.setPriority(5);
t3.setPriority(8);
//Establecer prioridades
ph1.hilo.setPriority(Thread.NORM_PRIORITY+2);
ph2.hilo.setPriority(Thread.NORM_PRIORITY-2);
//Deje ph3, ph4 y ph5 en el nivel de prioridad normal predeterminado
public ControladorFichero()
{
// Aqui abrimos el fichero y lo dejamos listo
// para escribir.
}
Los Hilos o los “Threads” en Java, son basicamente una forma de poder ejecutar varios
procesos simultáneamente en nuestros programas en Java.
Usualmente para poder utilizarlos tenemos que crear clases que extienden a la clase
Thread, y reescribir el metodo principal “run()”, el cual es el que se va a ejecutar
principalmente al iniciar un hilo, thread o nuevo proceso en java.
Ejemplo de hilos
Veamos como funcionan los Threads con una aplicación en Java. Vamos a
Netbeans y creamos un proyecto llamado Threads. Insertamos un JFrame y le
colocamos un botón con el que iniciaremos la ejecución se los Threads.
Estos métodos lo que harán es que le agregarán una unidad a cada una de las
variables, es decir, c1, c2 y c3.
Ahora nos dirigimos al final del programa, donde está el método public void
Las clases internas son interesantes porque nos permiten agrupar clases
relacionadas y controlar la visibilidad mutua de esas clases. Sin embargo son
algo totalmente diferente del mecanismo de composición que hemos visto y
tampoco hay que pensar en ellas como una forma de ocultar código: colocamos
clases dentro de otras clases. Una clase interna conoce los detalles de la clase
contenedora y puede comunicarse con ella. Además el tipo de código que puede
escribirse con las clases internas es más elegante y claro (aunque no siempre,
claro).
Una clase interna es una clase definida dentro de otra clase, llamada clase
contenedora, en alguna variante de la siguiente forma general:
class ClaseContenedora {
...
class ClaseInterna {
...
}
...
}
Las clases internas fueron introducidas en la versión Java 1.1.
Además de su utilidad en sí, las clases internas se utilizan mucho en el nuevo
modelo de eventos que se introdujo en dicha versión de Java.
//Clase externa
class ClaseExterna
//Miembro estático
//Miembro de instancia
int externo_y=20;
//Miembro privado
class ClaseInterna{
void mostrar(){
System.out.println("externo_x: "+externo_x);
System.out.println("externo_y: "+externo_y);
System.out.println("externo_privado: "+externo_privado);
class ClaseInternaDemo{
objetoInterno.mostrar();
Ejemplo:
Minimo: 1
Máximo: 9
Promedio: 5
Las interfaces de objetos son contratos que han de cumplir las clases que las
implementan. Contienen métodos vacíos que obligan a una clase a emplearlos,
promoviendo así un estándar de desarrollo.
Si una clase implementa una interface, está obligada a usar todos los métodos
de la misma (y los mismos tipos de argumentos de los métodos), de lo contrario
dará un error fatal. Pueden emplearse más de una interface en cada clase, y
pueden extenderse entre ellas mediante extends. Una interface puede extender
una o más interfaces.
Todos los métodos declarados en una interface deben ser públicos.
Para definir una interface se utiliza la parabra interface, y para extenderla se
utiliza implements.
interface Automovil {
public function getTipo();
public function getRuedas();
}
class Coche implements Automovil {
public function getTipo(){
echo "Coche";
}
public function getRuedas(){
echo "4";
}
}
class Moto implements Automovil {
public function getTipo(){
echo "Moto";
}
public function getRuedas(){
echo "2";
}
}
Las clases Coche y Moto están obligadas a definir las
funciones getTipo() y getRuedas(). Así se crea un modelo para todas
las clases de automóviles que deben aportar o definir unos métodos mínimos.
Si por ejemplo getTipo() tuviera un argumento de tipo Array: getTipo(Array
$tipos), las clases que implementen la interface deberán importar un argumento
del mismo tipo.
Las interfaces también pueden definir constantes, que funcionan igual que
las constantes en clases, pero no pueden ser sobreescritas por sus
descendientes, ya sean clases o interfaces.
Se utilizan cuando se tienen muchas clases que tienen en común un
comportamiento, pudiendo asegurar así que ciertos métodos estén disponibles
en cualquiera de los objetos que queramos crear. Son especialmente
importantes para la arquitectura de aplicaciones complejas.
A la hora de programar un sistema, podemos contar con objetos que son muy
diferentes y que por tanto no pertenecen a la misma jerarquía de herencia, pero
que deben realizar algunas acciones comunes. Por ejemplo, todos los objetos
con los que comercia unos grandes almacenes deben contar con la
funcionalidad de venderse. Una mesa tiene poco en común con un calefactor o
unas zapatillas, pero todos los productos disponibles deben implementar una
función para poder venderse.
Otro ejemplo. Una bombilla, un coche y un ordenador son clases muy distintas
que no pertenecen al mismo sistema de herencia, pero todas pueden
encenderse y apagarse. En este caso, podríamos construir una interfaz
llamada "encendible", que incluiría las funcionalidades de encender y apagar.
En este caso, la interfaz contendría dos funciones o métodos, uno encender() y
otro apagar().
interface encendible{
public function encender();
public function apagar();
}
Vemos que para definir una interfaz se utiliza la palabra clave interface,
seguida por el nombre de la interfaz y, entre llaves, el listado de métodos que
tendrá. Los métodos no se deben codificar, sino únicamente declararse.
Implementación de interfaces
function __construct(){
$this->gasolina = 0;
$this->bateria = 10;
}
Interfaz gráfica de usuario (En inglés Graphic User Interface, también conocido
con su acrónimo GUI) es un método para facilitar la interacción del usuario con
el ordenador o la computadora a través de la utilización de un conjunto de
imágenes y objetos pictóricos (iconos, ventanas..) además de texto. Surge como
evolución de la línea de comandos de los primeros sistemas operativos y es
pieza fundamental en un entorno gráfico.
Botón: En interfaces gráficas de usuario, los botones son tipos de widget que
permiten al usuario comenzar un evento, como buscar, aceptar una tarea,
interactuar con un cuadro de diálogo, etc.
Botón de Opción: Elemento en las interfaces gráficas que permite elegir sólo una
opción de un conjunto predefinido de opciones.
Icono: Los íconos del sistema son aquellos íconos que se utilizan para identificar
archivos, accesos directos, programas y herramientas del sistema operativo.
Lista: Una lista es una relación de datos, ordenados o clasificados según su tipo.
Lista Despegable: Tipo de elemento GUI que permite al usuario escribir sobre un
campo de texto mientras se muestra una lista de opciones.
4.2 IMPLEMENTACION
Hay muchas herramientas disponibles con las que los diseñadores pueden
crear la totalidad de las GUI. Algunas herramientas se pueden incorporar en en
entorno software(IDE).
GUI para móvil, para ordenador, para pantalla táctil, etc. Aquí se enumeran
algunas herramientas útiles para la construcción de una GUI:
FLUID
AppInventor (Android)
LucidChart
Wavemaker
Visual Studio
AWT y Swing
Java provee dos API's con las que podemos trabajar para desarrollar GUIs, la
más básica es AWT (Abstrct Window Toolkit). Las más desarrolladas se hacen
con Swing, las cuales son más identificables ya que todas comienzan con "J",
por ejemplo: JButton, JTextField, JTextArea, JPanel y JFrame son clases de
Swing.
Distribuciones Relativas
Los layouts determinan el criterio con el que se vaan a distribuir los componentes
dentro del container
FlowLayout : Distribuye los componentes uno al lado del otro en la parte superior
del container. Por defecto provee una alineación centrada, pero también puede
alinear a la izquierda o derecha.
FlowLayout
Este layout divide el espacio del container en cinco renglones o bordes y una
region central. Admite sólo un componente por región, por lo tanto un container
con esta distribución sólo podrá contener a lo sumo cinco componentes.
GridLayout
APLICACIÓN DE INTERFAZ
1.8 Rolles
1.9 Creacion de Permisos