🤔 Para Refletir :
"Apresente seu projeto com um post bonito. Isso atrai olhares, acredite."
- Delayzado

[AULA] Observer Pattern

Mayleone Feminino

Conde
Membro
Membro
Console.Write("Hello World!");
Juntou-se
25 de Outubro de 2016
Postagens
267
Bravecoins
3.009
Olá, como vão? Depois de uma sumida, resolvi voltar com algumas novidades: irei manter ativo meu canal no YouTube com tutoriais e aulas sobre programação (mais voltada a Unity e C#) mas pode ser que eu faça algo para RPG Maker e desenvolvimento de jogos num geral.

Para iniciar essa nova temporada no canal, resolvi criar uma série de vídeos sobre Design Patterns, que são essenciais para qualquer desenvolvedor sério!
Para iniciar nossa caminhada nesse assunto, nada como falar sobre um padrão muito útil: O Observer Pattern, então se ficou curioso, acesse o vídeo abaixo:

[youtube]https://youtu.be/ZoqKXvu8u_Y [/youtube]
 
Bom te ver de volta, May!

Design patterns são uma parte super importante de programação que geralmente é negligenciada nos tutoriais introdutórios, então acho bem legal você estar cobrindo esse assunto. Vou deixar aqui na minha playlist e quando tiver um tempinho assisto e te falo o que achei  _b
 
Exercício feito com sucesso. Valeu May! ;]
Eu ando tentando me aventurar no C# pra poder me relacionar melhor com a Unity. Deu pra pegar bastante coisa interessante com o vídeo.

oWfXCU6.png

Código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Observer_Pattern
{
	class Program
	{
		static void Main(string[] args)
		{
			var channel = new YouTubeChannel("Amamos Programar");
			
			var subscriber = new Subscriber("Random Guy");
			
			channel.Attach(subscriber);
			
			channel.Attach(new Subscriber("Pretty Guest"));
			channel.Attach(new Subscriber("Observador"));
			
			channel.UploadNewVideo();
			
			//
			
			channel.Detach(subscriber);
			
			channel.Attach(new VipSubscriber());
			
			channel.ChangeName(Amamos programar demais);
			
			Console.ReadKey();
		}
	}
	public interface ISubject
	{
		void Attach(IObserver o);
		void Detach(IObserver o);
		void Notify();
	}
	
	public interface IObserver
	{
		void Update(ISubject s);
	}
	
	public class YouTubeChannel : ISubject
	{
		readonly List<IObserver> observers;
		
		public string Name {get; private set;}
		
		public YouTubeChannel(string name)
		{
			observers = new List<IObserver>();
			
			Name = name;
		}		
		
		public void Attach(IObserver observer)
		{
			Console.WriteLine("Anexando novo observador!");
			Console.WriteLine();
			observers.Add(observer);
		}
		public void Detach(IObserver observer)
		{
			Console.WriteLine("Desanexando observador!");
			Console.WriteLine();
			observers.Remove(observer);
		}
		public void Notify()
		{
			foreach(var observer in observers)
				observer.Update()this;
		}
		
		public void ChangeName(string newName)
		{
			Console.WriteLine("O canal {0} alterou o nome para [1]", Name, newName);
			Console.WriteLine();
			Name = newName;
			
			Notify();
		}
		
		public void UploadNewVideo()
		{
			Console.WriteLine("O canal {0} postou um novo vídeo!", Name);
			Console.WriteLine();
			
			Notify();
		}
		
	}
	public class Subscriber : IObserver
	{
		public string Name { get; private set; }
		
		public Subscriber(string name)
		{
			Name = name;
		}
		
		public void Update(ISubject subject)
		{
			Console.WriteLine("O usuário {0} recebeu a notificação das alterações no canal{1}",
			Name, (subject as YouTubeChannel).Name);
			
			Console.WriteLine();
		}
	}
	public class VipSubscriber : IObserver
	{
		public void Update(ISubject subject)
		{
			Console.WriteLine("Hey, eu sou o usuário VIP mas também recebo notificações do canal {0}!!",
				()subject as YouTubeChannel).Name;
			Console.WriteLine();
		}
	}
}
 
Chegou em um ótimo momento! Estou basicamente me desenferrujando do C# e com planos de ir cada vez mais fundo nele! Melhor ainda ver que um grande nome entre o nosso meio, que é você, está produzindo o conteúdo que eu estou procurando! Vou acompanhar, com certeza!
 
Lord Wallace comentou:
Bom te ver de volta, May!

Design patterns são uma parte super importante de programação que geralmente é negligenciada nos tutoriais introdutórios, então acho bem legal você estar cobrindo esse assunto. Vou deixar aqui na minha playlist e quando tiver um tempinho assisto e te falo o que achei  _b

Oi, Lord! Obrigada pelo apoio! Em breve farei as outras aulas sobre design pattern, serão: Factory, Singleton, Decorator e Strategy que são os que eu mais curto!
Também teremos aulas sobre delegates e events (será a próxima, inclusive) e também reflection.
Para os iniciantes, farei uma série sobre C# para iniciantes do B à Ba, e também sobre Unity e como desenvolver alguns jogos nela, inclusive de cartas!
Espero que todo esse conteúdo possa ajudar o pessoal!

Nalfam comentou:
Tutoriais?
Com certeza irei acompanhar!

Acompanhe sim, vai ter bastante coisa legal daqui pra frente. <3

Kenpati Zaraque comentou:
Exercício feito com sucesso. Valeu May! ;]
Eu ando tentando me aventurar no C# pra poder me relacionar melhor com a Unity. Deu pra pegar bastante coisa interessante com o vídeo.

oWfXCU6.png
Código:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Observer_Pattern
{
	class Program
	{
		static void Main(string[] args)
		{
			var channel = new YouTubeChannel("Amamos Programar");
			
			var subscriber = new Subscriber("Random Guy");
			
			channel.Attach(subscriber);
			
			channel.Attach(new Subscriber("Pretty Guest"));
			channel.Attach(new Subscriber("Observador"));
			
			channel.UploadNewVideo();
			
			//
			
			channel.Detach(subscriber);
			
			channel.Attach(new VipSubscriber());
			
			channel.ChangeName(Amamos programar demais);
			
			Console.ReadKey();
		}
	}
	public interface ISubject
	{
		void Attach(IObserver o);
		void Detach(IObserver o);
		void Notify();
	}
	
	public interface IObserver
	{
		void Update(ISubject s);
	}
	
	public class YouTubeChannel : ISubject
	{
		readonly List<IObserver> observers;
		
		public string Name {get; private set;}
		
		public YouTubeChannel(string name)
		{
			observers = new List<IObserver>();
			
			Name = name;
		}		
		
		public void Attach(IObserver observer)
		{
			Console.WriteLine("Anexando novo observador!");
			Console.WriteLine();
			observers.Add(observer);
		}
		public void Detach(IObserver observer)
		{
			Console.WriteLine("Desanexando observador!");
			Console.WriteLine();
			observers.Remove(observer);
		}
		public void Notify()
		{
			foreach(var observer in observers)
				observer.Update()this;
		}
		
		public void ChangeName(string newName)
		{
			Console.WriteLine("O canal {0} alterou o nome para [1]", Name, newName);
			Console.WriteLine();
			Name = newName;
			
			Notify();
		}
		
		public void UploadNewVideo()
		{
			Console.WriteLine("O canal {0} postou um novo vídeo!", Name);
			Console.WriteLine();
			
			Notify();
		}
		
	}
	public class Subscriber : IObserver
	{
		public string Name { get; private set; }
		
		public Subscriber(string name)
		{
			Name = name;
		}
		
		public void Update(ISubject subject)
		{
			Console.WriteLine("O usuário {0} recebeu a notificação das alterações no canal{1}",
			Name, (subject as YouTubeChannel).Name);
			
			Console.WriteLine();
		}
	}
	public class VipSubscriber : IObserver
	{
		public void Update(ISubject subject)
		{
			Console.WriteLine("Hey, eu sou o usuário VIP mas também recebo notificações do canal {0}!!",
				()subject as YouTubeChannel).Name;
			Console.WriteLine();
		}
	}
}

Opa! Muito bem! Ficou top! Hahahaha! Conseguiu sacar a lógica direitinho ou houve alguma dificuldade sobre a implementação do código? Qualquer coisa estou a disposição!

Eliyud comentou:
Chegou em um ótimo momento! Estou basicamente me desenferrujando do C# e com planos de ir cada vez mais fundo nele! Melhor ainda ver que um grande nome entre o nosso meio, que é você, está produzindo o conteúdo que eu estou procurando! Vou acompanhar, com certeza!

Obrigada pelo apoio! Fico feliz em poder ajudar, de verdade!
Farei bastante conteúdo sobre C# e Unity no canal (como eu comentei com o Lord Wallace mais acima), então fiquem de olho! :D

Já estou planejando a próxima aula sobre o Observer Pattern em conjunto com delegates e events, vai ficar muito legal. <3
 
Voltar
Topo Inferior