{"id":3560,"date":"2018-04-08T16:54:36","date_gmt":"2018-04-08T16:54:36","guid":{"rendered":"http:\/\/pensemosweb.com.mx\/index.php\/2018\/04\/08\/implementar-patron-observador-javascript\/"},"modified":"2024-04-06T01:27:19","modified_gmt":"2024-04-06T07:27:19","slug":"implementar-patron-observador-javascript","status":"publish","type":"post","link":"https:\/\/pensemosweb.com\/en\/implementar-patron-observador-javascript\/","title":{"rendered":"Patr\u00f3n de dise\u00f1o observador en Javascript"},"content":{"rendered":"<h2 class=\"wp-block-heading\">\u00bfQu\u00e9 es el patr\u00f3n de dise\u00f1o observador?<\/h2>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>El patr\u00f3n de dise\u00f1o observador, define una dependencia de uno a muchos objetos de tal manera que cuando un objeto cambio de estado, todos sus dependientes son notificados y actualizados autom\u00e1ticamente<\/p>\n<cite>Del libro &#8220;Design patterns: elements of reusable object-oriented software&#8221;<\/cite><\/blockquote>\n\n\n\n<p>Si a\u00fan no sabes que es un patr\u00f3n de dise\u00f1o, <a rel=\"noreferrer noopener\" href=\"https:\/\/pensemosweb.com\/en\/patrones-de-diseno-en-javascript-singleton-factory\/\" target=\"_blank\">revisa primero esta publicaci\u00f3n sobre patrones de dise\u00f1o<\/a>.<\/p>\n\n\n\n<p>Si has utilizado eventos del navegador, como escuchar el evento <em>click&nbsp;<\/em>sobre un bot\u00f3n, ah\u00ed est\u00e1s utilizando el patr\u00f3n observador, tu funci\u00f3n callback es tu objeto <strong>observador&nbsp;<\/strong>y el bot\u00f3n es el <strong>sujeto<\/strong>, tu funci\u00f3n callback esta interesada en la actividad de dar <em>click&nbsp;<\/em>sobre el bot\u00f3n.<\/p>\n\n\n\n<p>Se compone de un <strong>Sujeto&nbsp;<\/strong>y uno o m\u00e1s <strong>Observadores<\/strong>. Veamos el diagrama tomado del libro <a rel=\"noreferrer noopener\" href=\"https:\/\/www.amazon.com\/Design-Patterns-Elements-Reusable-Object-Oriented\/dp\/0201633612\" target=\"_blank\"><strong>Design Patterns: Elements of reusable Object-Oriented software<\/strong><\/a>:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img decoding=\"async\" src=\"https:\/\/www.pensemosweb.com\/wp-content\/uploads\/2018\/04\/uml-observer.jpg\" alt=\"Patr\u00f3n de dise\u00f1o observador\" class=\"wp-image-302\" style=\"width:710px;height:285px\"\/><figcaption class=\"wp-element-caption\">Patr\u00f3n de dise\u00f1o observador<\/figcaption><\/figure>\n\n\n\n<p>He <strong>Sujeto&nbsp;<\/strong>est\u00e1 compuesto por las siguientes m\u00e9todos importantes que usaremos en nuestro c\u00f3digo javascript:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Una colecci\u00f3n de <code>observers<\/code><\/li>\n\n\n\n<li>M\u00e9todo <code>attach()<\/code> <\/li>\n\n\n\n<li>M\u00e9todo <code>detach()<\/code><\/li>\n\n\n\n<li>M\u00e9todo <code>notify()<\/code><\/li>\n<\/ul>\n\n\n\n<p>Normalmente un <strong>Observador&nbsp;<\/strong>contiene un m\u00e9todo <code>update()<\/code> que el <strong>Sujeto&nbsp;<\/strong>utiliza.<\/p>\n\n\n\n<p>Para tener m\u00e1s claro esto, vamos a ver dos ejemplos del patr\u00f3n observador, el primero ser\u00e1 el <strong>Observador puro&nbsp;<\/strong>y el segundo en su modo <strong>Publicador\/Suscriptor<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Simplificando el observador<\/h2>\n\n\n\n<p>Simplificando el diagrama anterior, el patr\u00f3n <strong>observador&nbsp;<\/strong>funciona as\u00ed:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2018\/04\/observer-pattern-1.jpg\" alt=\"Patr\u00f3n de dise\u00f1o observador simplificado\" class=\"wp-image-304\"\/><figcaption class=\"wp-element-caption\">Patr\u00f3n de dise\u00f1o observador simplificado<\/figcaption><\/figure>\n\n\n\n<p>Juega con el ejemplo de abajo, y agrega nuevos checkbox, si has agregado m\u00e1s de un nuevo checkbox, podemos notar que cuando damos <em><strong>click&nbsp;<\/strong><\/em>en el checkbox &#8216;<strong>Seleccionar<\/strong>&#8216; todos los dem\u00e1s checkbox nuevos se enteran de esa actividad y se actualizan autom\u00e1ticamente. <\/p>\n\n\n\n<p>Todo esto sin necesidad de estar al pendiente de que el checkbox &#8216;<strong>seleccionar<\/strong>&#8216; ha cambiado su estado, el encargado de notificar del cambio es el <strong>Sujeto&nbsp;<\/strong>y solo si existe alg\u00fan cambio. Esto es muy eficiente si tienes cientos o miles de checkbox observando ese cambio.<\/p>\n\n\n\n<p>Si das <em>click<\/em> sobre uno de los checkbox, se ejecuta el m\u00e9todo <code><strong>subject.detach()<\/strong><\/code>, entonces ese checkbox ya no es un observador, por lo que si ahora activas y desactivas el checkbox <strong>seleccionar<\/strong> nunca es notificado sobre el cambio.<\/p>\n\n\n\n<figure><iframe src=\"\/\/codepen.io\/jaime_cervantes_ve\/embed\/rdGmyJ\/?height=265&amp;theme-id=0&amp;default-tab=js,result&amp;embed-version=2#full\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Publicador\/suscriptor simple<\/h2>\n\n\n\n<p>El patr\u00f3n de dise\u00f1o <strong>publicador\/suscriptor<\/strong> es una variaci\u00f3n del observador, en este modo el suscriptor u observador se suscribe a una actividad o evento del publicador o sujeto. <\/p>\n\n\n\n<p>He <strong>publicador<\/strong> notifica a todos los objetos <strong>suscritos<\/strong> cuando el evento al que est\u00e1n interesados se dispara o <strong>publica<\/strong>. <\/p>\n\n\n\n<p>He<strong>&nbsp;publicador&nbsp;<\/strong>est\u00e1 compuesto por las siguientes m\u00e9todos importantes que usaremos en nuestro c\u00f3digo javascript:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Una colecci\u00f3n de <code>observers<\/code> either <code>subscribers<\/code><\/li>\n\n\n\n<li>M\u00e9todo <code>subscribe()<\/code> either <code>attach()<\/code> <\/li>\n\n\n\n<li>M\u00e9todo <code>unsubscribe()<\/code> either <code>detach()<\/code><\/li>\n\n\n\n<li>M\u00e9todo <code>publish()<\/code> either <code>notify()<\/code><\/li>\n<\/ul>\n\n\n\n<p>Aqu\u00ed dejo el diagrama simple de como funciona esta versi\u00f3n:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"\/wp-content\/uploads\/2018\/04\/publisher_subscriber.jpg\" alt=\"Patr\u00f3n de dise\u00f1o publicador\/suscriptor simplificado\" class=\"wp-image-305\"\/><figcaption class=\"wp-element-caption\">Patr\u00f3n de dise\u00f1o publicador\/suscriptor simplificado<\/figcaption><\/figure>\n\n\n\n<figure><iframe src=\"\/\/codepen.io\/jaime_cervantes_ve\/embed\/geKwxp\/?height=265&amp;theme-id=0&amp;default-tab=js,result&amp;embed-version=2#full\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/figure>\n\n\n\n<p>He <strong>publicador\/suscriptor<\/strong> se parece m\u00e1s a los eventos del DOM y a eventos personalizados, pero no deja de ser el <strong>patr\u00f3n de dise\u00f1o Observador<\/strong>. Ademas, como observadores, podemos suscribirnos a m\u00e1s de una actividad o evento.<\/p>\n\n\n\n<p>En el ejemplo, el m\u00e9todo <code><strong>suscribe<\/strong><\/code> agrega la funci\u00f3n observadora, esta \u00faltima se ejecuta cuando la actividad <em>click<\/em> es publicada.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#0F111A\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewbox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" data-code=\"publisherSeleccionar.subscribe('check', subscriberCheckbox.update, subscriberCheckbox);\" style=\"color:#babed8;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewbox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki material-theme-ocean\" style=\"background-color: #0F111A\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #BABED8\">publisherSeleccionar<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #82AAFF\">subscribe<\/span><span style=\"color: #BABED8\">(<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #C3E88D\">check<\/span><span style=\"color: #89DDFF\">&#39;<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> subscriberCheckbox<\/span><span style=\"color: #89DDFF\">.<\/span><span style=\"color: #BABED8\">update<\/span><span style=\"color: #89DDFF\">,<\/span><span style=\"color: #BABED8\"> subscriberCheckbox)<\/span><span style=\"color: #89DDFF\">;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>En conclusi\u00f3n, el patr\u00f3n de dise\u00f1o observador es muy \u00fatil, se puede modificar o adecuarlo a ciertas necesidades, un ejemplo es la variacion publicador\/suscriptor. Se usa en:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>ReactveX.<\/li>\n\n\n\n<li>Librerias y frameworks de componentes web tales como angular, react, lit, vue, svelte utilizan este patr\u00f3n para su bindeo de datos.<\/li>\n\n\n\n<li>Navegadores web cuando usamos eventos<\/li>\n\n\n\n<li>Node.js cuando utilizamos EventEmitter al recibir una petici\u00f3n a nuestro servidor o al leer un archivo del disco duro.<\/li>\n\n\n\n<li>Flux y <a href=\"https:\/\/pensemosweb.com\/en\/como-empezar-con-redux-en-7-minutos\/\">redux<\/a> para manejar cambios en el estado de nuestra aplicaci\u00f3n.<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>\u00bfQu\u00e9 es el patr\u00f3n de dise\u00f1o observador? El patr\u00f3n de dise\u00f1o observador, define una dependencia de uno a muchos objetos de tal manera que cuando un objeto cambio de estado, todos sus dependientes son notificados y actualizados autom\u00e1ticamente Del libro &#8220;Design patterns: elements of reusable object-oriented software&#8221; Si a\u00fan no sabes que es un patr\u00f3n [&hellip;]<\/p>","protected":false},"author":2,"featured_media":3741,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[28],"tags":[54,68],"class_list":["post-3560","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-javascript","tag-javascript","tag-intermedio"],"_links":{"self":[{"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts\/3560","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/comments?post=3560"}],"version-history":[{"count":2,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts\/3560\/revisions"}],"predecessor-version":[{"id":3832,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/posts\/3560\/revisions\/3832"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/media\/3741"}],"wp:attachment":[{"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/media?parent=3560"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/categories?post=3560"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/pensemosweb.com\/en\/wp-json\/wp\/v2\/tags?post=3560"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}