SlideShare une entreprise Scribd logo
1  sur  49
Design Patterns com C# Fernando Kakimoto [email_address] www.twitter.com/nandokakimoto
Quem Sou Eu? ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Agenda ,[object Object],[object Object],[object Object],[object Object],[object Object]
Introdução ,[object Object]
Introdução ,[object Object],[object Object],[object Object],[object Object],[object Object]
Introdução ,[object Object]
Introdução ,[object Object],[object Object]
Por que padrões? ,[object Object],[object Object],[object Object],[object Object]
Nomenclatura ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Classificação Propósito Criacional Estrutural Comportamental Escopo Classe Factory Method Adapter (class) Interpreter Template Method Objeto Abstract Factory Builder Prototype Singleton Adapter (object) Bridge Composite Decorator Facade Flyweight Proxy Chain of Responsability Command Iterator Mediator Memento Observer State Strategy Visitor
Factory Method Intenção Motivação Consequências Fornece uma interface para criação de famílias de objetos, sem especificar suas classes concretas A classe não pode antecipar o objeto que ela deve criar A classe precisa que a subclasse especifique o objeto criado Programação para interfaces Necessidade de subclasses  Creator  para criação de  Products  específicos
Factory Method ,[object Object]
Factory Method ,[object Object]
Factory Method
Factory Method ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],public class  LineManipulator : Manipulator { public void  DownClick() { Console. WriteLine( "Line DownClick()" ); } public void  Drag() { Console. WriteLine( "Line Drag()" ); } public void  UpClick() { Console. WriteLine( "Line UpClick()" ); } } public class  TextManipulator : Manipulator { public void  DownClick() { Console. WriteLine( “Text DownClick()" ); } public void  Drag() { Console. WriteLine( “Text Drag()" ); } public void  UpClick() { Console. WriteLine( “Text UpClick()" ); } }
Factory Method ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],public class  LineFigure : Figure { public override void  CreateManipulator() { this. Manipulator = new   LineManipulator (); } } public class  TextFigure : Figure { public override void  CreateManipulator() { this .Manipulator = new   TextManipulator (); } }
Factory Method class  Program { static void  Main( string [ ] args) { Figure  figure =   new  LineFigure (); figure.DoSomething(); figure =  new  TextFigure (); figure.DoSomething();  } }
Decorator Intenção Motivação Consequências Adiciona responsabilidades dinamicamente a um objeto Adicionar responsabilidades a objetos ao invés de classes Responsabilidades podem ser retiradas Quando extensão por herança é impraticável Mais flexibilidade do que heranças estáticas Evita explosão de classes Inúmeros objetos semelhantes
[object Object],Decorator
Decorator ,[object Object]
Decorator
Decorator public abstract class  LibraryItem { public int  NumCopies {  get; set;  } public abstract void  Display(); } public class  Book : LibraryItem { private string  Author; private string  Title; public  Book( string  author , string  title , int  numCopies) { this. Author = author; this. Title = title; this. NumCopies = numCopies; } public override void  Display() { Console. WriteLine( "*** Book ***" ); Console. WriteLine( "Author: {0}" , Author); Console. WriteLine( "Title: {0}" , Title); Console. WriteLine( "#Copies: {0}" , NumCopies); } }
Decorator public class  Decorator : LibraryItem { protected  LibraryItem LibraryItem  {   get; set;  } public  Decorator( LibraryItem  libraryItem) { this. LibraryItem   = libraryItem; } public override void  Display() { LibraryItem.Display(); } } public abstract class  LibraryItem { public int  NumCopies {  get; set;  } public abstract void  Display(); }
Decorator class  Program { static void  Main( string [ ] args) { Book book =  new  Book( &quot;Worley&quot;, &quot;Inside ASP.NET&quot; , 10); book.Display(); Borrowable borrowBook =  new  Borrowable (book); borrowBook.BorrowItem( &quot;Customer #1&quot; ); borrowBook.BorrowItem( &quot;Customer #2&quot; ); borrowBook.Display(); } } public class  Borrowable : Decorator { public  List < string >   Borrowers {  get ;  private set ; } public  Borrowable (  LibraryItem  libraryItem ) :  base  (libraryItem) { this .Borrowers = new   List < string >(); } public void  BorrowItem( string  name) { Borrowers.Add(name); this .LibraryItem.NumCopies- -; } public override void  Display() { base. Display(); Borrowers.ForEach( b =>   Console.WriteLine ( &quot;borrower: {0}&quot; , b)); } }
Observer Intenção Motivação Consequências Define dependências entre objetos, tal que quando um objeto muda de estado, seus dependentes são notificados e atualizados Manter consistência entre objetos relacionados Manter baixo acoplamento Um objeto deve notificar outro objeto sem fazer suposições prévias Acoplamento abstrato entre Subject e Observer Suporte para comunicação broadcast Atualizações inesperadas
Observer ,[object Object]
Observer ,[object Object]
Observer
Observer public abstract class  Subject <T> { private  List < Observer <T>> Observers; public  Subject() { this .Observers = new  List < Observer <T>>(); } public void  Attach( Observer <T> o) { this .Observers.Add(o); } public void  Detach( Observer <T> o) { this .Observers.Remove(o); } public void  Notify(T data) { this .Observers.ForEach(o => o.Update(data)); } } public class  ClockTimer : Subject < DateTime > { public  DateTime  CurrentTime {  get; set;  } public  ClockTimer( DateTime  time) { this. CurrentTime = time; } public void  Tick() { this. CurrentTime =   DateTime .Now; this .Notify( this .CurrentTime); } }
Observer public interface  Observer <T> { void  Update(T data); } public class  AnalogicTimer : Observer < DateTime > { public void  Update( DateTime  time) { Console .WriteLine( &quot;AnalogicTimer {0}&quot; , time); } } public class  DigitalTimer : Observer < DateTime > { public void  Update( DateTime  time) { Console .WriteLine( &quot;DigitalTimer {0}&quot; , time); } }
Observer class  Program { static void  Main( string [ ] args) { ClockTimer  timer =   new  ClockTimer ( DateTime .Now); AnalogicTimer  analogicTimer =  new  AnalogicTimer (); timer.Attach(analogicTimer); DigitalTimer  digitalTimer =  new  DigitalTimer (); timer.Attach(digitalTimer); timer.Tick(); timer.Detach(analogicTimer); Thread .Sleep(5000); timer.Tick(); } }
Strategy Intenção Motivação Consequências Define uma família de algoritmos, encapsula cada um, e os torna substituíveis. Configurar uma classe com um entre vários comportamentos Diferentes variação para um mesmo algoritmo Encapsula detalhes de implementação de um algoritmo Define um comportamento para contextos de reuso Alternativa a extensão de classes Elimina instruções condicionais
Strategy ,[object Object]
Strategy ,[object Object]
Strategy
Strategy public interface  PersistenceStrategy <T> { void  Save(T item); void  Remove(T item); bool  Exists(T item); } public class  CollectionPersistence <T> :  PersistenceStrategy <T> { public void  Save(T item) { Console. WriteLine( &quot;CollectionPersistence: Save&quot; ); } public void  Remove(T item) { Console .WriteLine( &quot;CollectionPersistence: Remove&quot; ); } public bool  Exists(T item) { Console .WriteLine( &quot;CollectionPersistence: Exists&quot; ); return false; } }
Strategy class  Program { static void  Main( string [ ] args) { Contact  c =  new  Contact() { Name =   &quot;Fernando Kakimoto&quot;, PhoneNumer =  &quot;(81)9162-2997&quot;, Email =  &quot;nandokakimoto@gmail.com&quot; }; PersistenceStrategy < Contact > persistence =  new  CollectionPersistence < Contact >(); persistence.Save(c); persistence.Remove(c); persistence.Exists(c); persistence =  new  DataBasePersistence < Contact >(); persistence.Save(c); persistence.Remove(c); persistence.Exists(c); } } public class  DataBasePersistence <T> :  PersistenceStrategy <T> { public void  Save(T item) { Console .WriteLine( &quot;DataBasePersistence: Save&quot; ); } public void  Remove(T item) { Console .WriteLine( &quot;DataBasePersistence: Remove&quot; ); } public bool  Exists(T item) { Console .WriteLine( &quot;DataBasePersistence: Exists&quot; ); return false; } }
SOLID Principles ,[object Object],[object Object],[object Object],[object Object]
SOLID Principles ,[object Object],[object Object],[object Object],[object Object],[object Object]
Single Responsability Principle ,[object Object],[object Object],[object Object]
Open-Closed Principle ,[object Object],[object Object]
Liskov Substituition Principle ,[object Object],[object Object],[object Object]
Interface Segregation Principle ,[object Object],[object Object]
Dependency Inversion Principle ,[object Object],[object Object]
Anti-Patterns ,[object Object],[object Object],[object Object],[object Object],[object Object]
Anti-Patterns ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Anti-Patterns ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Perguntas
Design Patterns com C# Fernando Kakimoto [email_address] www.twitter.com/nandokakimoto

Contenu connexe

En vedette

eliot.doc
eliot.doceliot.doc
eliot.docbutest
 
3_learning.ppt
3_learning.ppt3_learning.ppt
3_learning.pptbutest
 
I NTRODUCTION.doc
I NTRODUCTION.docI NTRODUCTION.doc
I NTRODUCTION.docbutest
 
Automatic detection of microchiroptera echolocation calls ...
Automatic detection of microchiroptera echolocation calls ...Automatic detection of microchiroptera echolocation calls ...
Automatic detection of microchiroptera echolocation calls ...butest
 
Web Design Contest.doc
Web Design Contest.docWeb Design Contest.doc
Web Design Contest.docbutest
 
Query Linguistic Intent Detection
Query Linguistic Intent DetectionQuery Linguistic Intent Detection
Query Linguistic Intent Detectionbutest
 
Topic 1 Topic 2 Topic 3
Topic 1 Topic 2 Topic 3Topic 1 Topic 2 Topic 3
Topic 1 Topic 2 Topic 3butest
 
Means for transferring knowledge in the relocation of ...
Means for transferring knowledge in the relocation of ...Means for transferring knowledge in the relocation of ...
Means for transferring knowledge in the relocation of ...butest
 
Cach Tri Benh Viem Khop
Cach Tri Benh Viem KhopCach Tri Benh Viem Khop
Cach Tri Benh Viem Khopclifford175
 
Viêm Xương Khớp Makong
Viêm Xương Khớp MakongViêm Xương Khớp Makong
Viêm Xương Khớp Makongcristen394
 
Microsoft System Center Essentials Overview
Microsoft System Center Essentials OverviewMicrosoft System Center Essentials Overview
Microsoft System Center Essentials Overviewbutest
 
lec21.ppt
lec21.pptlec21.ppt
lec21.pptbutest
 
Towards Machine Learning of Motor Skills
Towards Machine Learning of Motor SkillsTowards Machine Learning of Motor Skills
Towards Machine Learning of Motor Skillsbutest
 
User's Guide
User's GuideUser's Guide
User's Guidebutest
 
Christopher N. Bull History-Sensitive Detection of Design Flaws B ...
Christopher N. Bull History-Sensitive Detection of Design Flaws B ...Christopher N. Bull History-Sensitive Detection of Design Flaws B ...
Christopher N. Bull History-Sensitive Detection of Design Flaws B ...butest
 
Practical Knowledge Representation
Practical Knowledge RepresentationPractical Knowledge Representation
Practical Knowledge Representationbutest
 

En vedette (17)

eliot.doc
eliot.doceliot.doc
eliot.doc
 
3_learning.ppt
3_learning.ppt3_learning.ppt
3_learning.ppt
 
I NTRODUCTION.doc
I NTRODUCTION.docI NTRODUCTION.doc
I NTRODUCTION.doc
 
Automatic detection of microchiroptera echolocation calls ...
Automatic detection of microchiroptera echolocation calls ...Automatic detection of microchiroptera echolocation calls ...
Automatic detection of microchiroptera echolocation calls ...
 
Web Design Contest.doc
Web Design Contest.docWeb Design Contest.doc
Web Design Contest.doc
 
Query Linguistic Intent Detection
Query Linguistic Intent DetectionQuery Linguistic Intent Detection
Query Linguistic Intent Detection
 
Topic 1 Topic 2 Topic 3
Topic 1 Topic 2 Topic 3Topic 1 Topic 2 Topic 3
Topic 1 Topic 2 Topic 3
 
Hanh Phuc
Hanh PhucHanh Phuc
Hanh Phuc
 
Means for transferring knowledge in the relocation of ...
Means for transferring knowledge in the relocation of ...Means for transferring knowledge in the relocation of ...
Means for transferring knowledge in the relocation of ...
 
Cach Tri Benh Viem Khop
Cach Tri Benh Viem KhopCach Tri Benh Viem Khop
Cach Tri Benh Viem Khop
 
Viêm Xương Khớp Makong
Viêm Xương Khớp MakongViêm Xương Khớp Makong
Viêm Xương Khớp Makong
 
Microsoft System Center Essentials Overview
Microsoft System Center Essentials OverviewMicrosoft System Center Essentials Overview
Microsoft System Center Essentials Overview
 
lec21.ppt
lec21.pptlec21.ppt
lec21.ppt
 
Towards Machine Learning of Motor Skills
Towards Machine Learning of Motor SkillsTowards Machine Learning of Motor Skills
Towards Machine Learning of Motor Skills
 
User's Guide
User's GuideUser's Guide
User's Guide
 
Christopher N. Bull History-Sensitive Detection of Design Flaws B ...
Christopher N. Bull History-Sensitive Detection of Design Flaws B ...Christopher N. Bull History-Sensitive Detection of Design Flaws B ...
Christopher N. Bull History-Sensitive Detection of Design Flaws B ...
 
Practical Knowledge Representation
Practical Knowledge RepresentationPractical Knowledge Representation
Practical Knowledge Representation
 

Similaire à Design Patterns com C

Java orientação a objetos (interfaces)
Java   orientação a objetos (interfaces)Java   orientação a objetos (interfaces)
Java orientação a objetos (interfaces)Armando Daniel
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javJulio Viegas
 
Plataforma de compiladores .NET, Visual Studio 2015, C# 6 e futuro C# 7
Plataforma de compiladores .NET,Visual Studio 2015, C# 6 e futuro C# 7Plataforma de compiladores .NET,Visual Studio 2015, C# 6 e futuro C# 7
Plataforma de compiladores .NET, Visual Studio 2015, C# 6 e futuro C# 7Rogério Moraes de Carvalho
 
Beljug2010
Beljug2010Beljug2010
Beljug2010UFPA
 
Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”
Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”
Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”Rogério Moraes de Carvalho
 
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015Rogério Moraes de Carvalho
 
Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverEduardo Jorge
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHGiovanni Bassi
 
Semana 9: toString, classes, instâncias e objectos, Scanner
Semana  9: toString, classes, instâncias e objectos, ScannerSemana  9: toString, classes, instâncias e objectos, Scanner
Semana 9: toString, classes, instâncias e objectos, ScannerManuel Menezes de Sequeira
 
Reduzindo o boilerplate code com Lombok
Reduzindo o boilerplate code com LombokReduzindo o boilerplate code com Lombok
Reduzindo o boilerplate code com LombokWellington Pinheiro
 
O fantástico mundo de Android
O fantástico mundo de AndroidO fantástico mundo de Android
O fantástico mundo de AndroidSuelen Carvalho
 
Arquitetura e Design QCon2010 - Paulo Silveira - Caelum
Arquitetura e Design QCon2010 - Paulo Silveira - CaelumArquitetura e Design QCon2010 - Paulo Silveira - Caelum
Arquitetura e Design QCon2010 - Paulo Silveira - CaelumCaelum
 
AspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em JavaAspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em Javaelliando dias
 
Desvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor AndroidDesvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor Androidjoaobmonteiro
 

Similaire à Design Patterns com C (20)

Java orientação a objetos (interfaces)
Java   orientação a objetos (interfaces)Java   orientação a objetos (interfaces)
Java orientação a objetos (interfaces)
 
Ecosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_javEcosistema spring a_plataforma_enterprise_jav
Ecosistema spring a_plataforma_enterprise_jav
 
Plataforma de compiladores .NET, Visual Studio 2015, C# 6 e futuro C# 7
Plataforma de compiladores .NET,Visual Studio 2015, C# 6 e futuro C# 7Plataforma de compiladores .NET,Visual Studio 2015, C# 6 e futuro C# 7
Plataforma de compiladores .NET, Visual Studio 2015, C# 6 e futuro C# 7
 
Beljug2010
Beljug2010Beljug2010
Beljug2010
 
Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”
Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”
Plataforma de compiladores .NET (“Roslyn”), C# 6 e Visual Studio “14”
 
Kotlin first
Kotlin firstKotlin first
Kotlin first
 
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
Plataforma de compiladores .NET, C# 6 e Visual Studio 2015
 
Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserver
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Semana 9: toString, classes, instâncias e objectos, Scanner
Semana  9: toString, classes, instâncias e objectos, ScannerSemana  9: toString, classes, instâncias e objectos, Scanner
Semana 9: toString, classes, instâncias e objectos, Scanner
 
Reduzindo o boilerplate code com Lombok
Reduzindo o boilerplate code com LombokReduzindo o boilerplate code com Lombok
Reduzindo o boilerplate code com Lombok
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
Mock Objects
Mock ObjectsMock Objects
Mock Objects
 
O fantástico mundo de Android
O fantástico mundo de AndroidO fantástico mundo de Android
O fantástico mundo de Android
 
Java 06
Java 06Java 06
Java 06
 
Java5
Java5Java5
Java5
 
Arquitetura e Design QCon2010 - Paulo Silveira - Caelum
Arquitetura e Design QCon2010 - Paulo Silveira - CaelumArquitetura e Design QCon2010 - Paulo Silveira - Caelum
Arquitetura e Design QCon2010 - Paulo Silveira - Caelum
 
AspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em JavaAspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em Java
 
VRaptor4
VRaptor4VRaptor4
VRaptor4
 
Desvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor AndroidDesvendando as ferramentas e serviços para o desenvolvedor Android
Desvendando as ferramentas e serviços para o desenvolvedor Android
 

Plus de Felipe Pimentel

Windows Phone 7 para um público não TI
Windows Phone 7 para um público não TIWindows Phone 7 para um público não TI
Windows Phone 7 para um público não TIFelipe Pimentel
 
Desenvolvendo com Silverlight para WP7 Mango [Update]
Desenvolvendo com Silverlight para WP7 Mango [Update]Desenvolvendo com Silverlight para WP7 Mango [Update]
Desenvolvendo com Silverlight para WP7 Mango [Update]Felipe Pimentel
 
Maratona Windows Phone 7
Maratona Windows Phone 7Maratona Windows Phone 7
Maratona Windows Phone 7Felipe Pimentel
 
Proposta planos digaonde
Proposta planos digaondeProposta planos digaonde
Proposta planos digaondeFelipe Pimentel
 
Silverlight no MIC Summer 2011
Silverlight no MIC Summer 2011 Silverlight no MIC Summer 2011
Silverlight no MIC Summer 2011 Felipe Pimentel
 
Parceria DotNetArchitects PE com TWM
Parceria DotNetArchitects PE com  TWM Parceria DotNetArchitects PE com  TWM
Parceria DotNetArchitects PE com TWM Felipe Pimentel
 
[CLPE] Novidades do .net Framework 4.0
[CLPE] Novidades do .net Framework 4.0[CLPE] Novidades do .net Framework 4.0
[CLPE] Novidades do .net Framework 4.0Felipe Pimentel
 
[CLPE] Visual Studio 2010
[CLPE] Visual Studio 2010[CLPE] Visual Studio 2010
[CLPE] Visual Studio 2010Felipe Pimentel
 
[CLPE] Novidades do Asp.net mvc 2
[CLPE] Novidades do Asp.net mvc 2[CLPE] Novidades do Asp.net mvc 2
[CLPE] Novidades do Asp.net mvc 2Felipe Pimentel
 
[CLPE] Novidades do Asp.net 4
[CLPE] Novidades do Asp.net 4[CLPE] Novidades do Asp.net 4
[CLPE] Novidades do Asp.net 4Felipe Pimentel
 
[CLPE] Novidades do Entity Framework 4
[CLPE] Novidades do Entity Framework 4[CLPE] Novidades do Entity Framework 4
[CLPE] Novidades do Entity Framework 4Felipe Pimentel
 
ASP.NET WebForms x ASP.NET MVC
ASP.NET WebForms x ASP.NET MVCASP.NET WebForms x ASP.NET MVC
ASP.NET WebForms x ASP.NET MVCFelipe Pimentel
 
TDD (Test Driven Development)
TDD (Test Driven Development)TDD (Test Driven Development)
TDD (Test Driven Development)Felipe Pimentel
 

Plus de Felipe Pimentel (16)

Windows Phone 7 para um público não TI
Windows Phone 7 para um público não TIWindows Phone 7 para um público não TI
Windows Phone 7 para um público não TI
 
Desenvolvendo com Silverlight para WP7 Mango [Update]
Desenvolvendo com Silverlight para WP7 Mango [Update]Desenvolvendo com Silverlight para WP7 Mango [Update]
Desenvolvendo com Silverlight para WP7 Mango [Update]
 
Maratona Windows Phone 7
Maratona Windows Phone 7Maratona Windows Phone 7
Maratona Windows Phone 7
 
Proposta planos digaonde
Proposta planos digaondeProposta planos digaonde
Proposta planos digaonde
 
Silverlight no MIC Summer 2011
Silverlight no MIC Summer 2011 Silverlight no MIC Summer 2011
Silverlight no MIC Summer 2011
 
Mvc 3 & razor
Mvc 3 & razorMvc 3 & razor
Mvc 3 & razor
 
MVVM
MVVMMVVM
MVVM
 
Parceria DotNetArchitects PE com TWM
Parceria DotNetArchitects PE com  TWM Parceria DotNetArchitects PE com  TWM
Parceria DotNetArchitects PE com TWM
 
[CLPE] Novidades do .net Framework 4.0
[CLPE] Novidades do .net Framework 4.0[CLPE] Novidades do .net Framework 4.0
[CLPE] Novidades do .net Framework 4.0
 
[CLPE] Visual Studio 2010
[CLPE] Visual Studio 2010[CLPE] Visual Studio 2010
[CLPE] Visual Studio 2010
 
[CLPE] Novidades do Asp.net mvc 2
[CLPE] Novidades do Asp.net mvc 2[CLPE] Novidades do Asp.net mvc 2
[CLPE] Novidades do Asp.net mvc 2
 
[CLPE] Novidades do Asp.net 4
[CLPE] Novidades do Asp.net 4[CLPE] Novidades do Asp.net 4
[CLPE] Novidades do Asp.net 4
 
[CLPE] Novidades do Entity Framework 4
[CLPE] Novidades do Entity Framework 4[CLPE] Novidades do Entity Framework 4
[CLPE] Novidades do Entity Framework 4
 
ASP.NET WebForms x ASP.NET MVC
ASP.NET WebForms x ASP.NET MVCASP.NET WebForms x ASP.NET MVC
ASP.NET WebForms x ASP.NET MVC
 
Windows Phone 7
Windows Phone 7Windows Phone 7
Windows Phone 7
 
TDD (Test Driven Development)
TDD (Test Driven Development)TDD (Test Driven Development)
TDD (Test Driven Development)
 

Design Patterns com C

  • 1. Design Patterns com C# Fernando Kakimoto [email_address] www.twitter.com/nandokakimoto
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10. Classificação Propósito Criacional Estrutural Comportamental Escopo Classe Factory Method Adapter (class) Interpreter Template Method Objeto Abstract Factory Builder Prototype Singleton Adapter (object) Bridge Composite Decorator Facade Flyweight Proxy Chain of Responsability Command Iterator Mediator Memento Observer State Strategy Visitor
  • 11. Factory Method Intenção Motivação Consequências Fornece uma interface para criação de famílias de objetos, sem especificar suas classes concretas A classe não pode antecipar o objeto que ela deve criar A classe precisa que a subclasse especifique o objeto criado Programação para interfaces Necessidade de subclasses Creator para criação de Products específicos
  • 12.
  • 13.
  • 15.
  • 16.
  • 17. Factory Method class Program { static void Main( string [ ] args) { Figure figure = new LineFigure (); figure.DoSomething(); figure = new TextFigure (); figure.DoSomething(); } }
  • 18. Decorator Intenção Motivação Consequências Adiciona responsabilidades dinamicamente a um objeto Adicionar responsabilidades a objetos ao invés de classes Responsabilidades podem ser retiradas Quando extensão por herança é impraticável Mais flexibilidade do que heranças estáticas Evita explosão de classes Inúmeros objetos semelhantes
  • 19.
  • 20.
  • 22. Decorator public abstract class LibraryItem { public int NumCopies { get; set; } public abstract void Display(); } public class Book : LibraryItem { private string Author; private string Title; public Book( string author , string title , int numCopies) { this. Author = author; this. Title = title; this. NumCopies = numCopies; } public override void Display() { Console. WriteLine( &quot;*** Book ***&quot; ); Console. WriteLine( &quot;Author: {0}&quot; , Author); Console. WriteLine( &quot;Title: {0}&quot; , Title); Console. WriteLine( &quot;#Copies: {0}&quot; , NumCopies); } }
  • 23. Decorator public class Decorator : LibraryItem { protected LibraryItem LibraryItem { get; set; } public Decorator( LibraryItem libraryItem) { this. LibraryItem = libraryItem; } public override void Display() { LibraryItem.Display(); } } public abstract class LibraryItem { public int NumCopies { get; set; } public abstract void Display(); }
  • 24. Decorator class Program { static void Main( string [ ] args) { Book book = new Book( &quot;Worley&quot;, &quot;Inside ASP.NET&quot; , 10); book.Display(); Borrowable borrowBook = new Borrowable (book); borrowBook.BorrowItem( &quot;Customer #1&quot; ); borrowBook.BorrowItem( &quot;Customer #2&quot; ); borrowBook.Display(); } } public class Borrowable : Decorator { public List < string > Borrowers { get ; private set ; } public Borrowable ( LibraryItem libraryItem ) : base (libraryItem) { this .Borrowers = new List < string >(); } public void BorrowItem( string name) { Borrowers.Add(name); this .LibraryItem.NumCopies- -; } public override void Display() { base. Display(); Borrowers.ForEach( b => Console.WriteLine ( &quot;borrower: {0}&quot; , b)); } }
  • 25. Observer Intenção Motivação Consequências Define dependências entre objetos, tal que quando um objeto muda de estado, seus dependentes são notificados e atualizados Manter consistência entre objetos relacionados Manter baixo acoplamento Um objeto deve notificar outro objeto sem fazer suposições prévias Acoplamento abstrato entre Subject e Observer Suporte para comunicação broadcast Atualizações inesperadas
  • 26.
  • 27.
  • 29. Observer public abstract class Subject <T> { private List < Observer <T>> Observers; public Subject() { this .Observers = new List < Observer <T>>(); } public void Attach( Observer <T> o) { this .Observers.Add(o); } public void Detach( Observer <T> o) { this .Observers.Remove(o); } public void Notify(T data) { this .Observers.ForEach(o => o.Update(data)); } } public class ClockTimer : Subject < DateTime > { public DateTime CurrentTime { get; set; } public ClockTimer( DateTime time) { this. CurrentTime = time; } public void Tick() { this. CurrentTime = DateTime .Now; this .Notify( this .CurrentTime); } }
  • 30. Observer public interface Observer <T> { void Update(T data); } public class AnalogicTimer : Observer < DateTime > { public void Update( DateTime time) { Console .WriteLine( &quot;AnalogicTimer {0}&quot; , time); } } public class DigitalTimer : Observer < DateTime > { public void Update( DateTime time) { Console .WriteLine( &quot;DigitalTimer {0}&quot; , time); } }
  • 31. Observer class Program { static void Main( string [ ] args) { ClockTimer timer = new ClockTimer ( DateTime .Now); AnalogicTimer analogicTimer = new AnalogicTimer (); timer.Attach(analogicTimer); DigitalTimer digitalTimer = new DigitalTimer (); timer.Attach(digitalTimer); timer.Tick(); timer.Detach(analogicTimer); Thread .Sleep(5000); timer.Tick(); } }
  • 32. Strategy Intenção Motivação Consequências Define uma família de algoritmos, encapsula cada um, e os torna substituíveis. Configurar uma classe com um entre vários comportamentos Diferentes variação para um mesmo algoritmo Encapsula detalhes de implementação de um algoritmo Define um comportamento para contextos de reuso Alternativa a extensão de classes Elimina instruções condicionais
  • 33.
  • 34.
  • 36. Strategy public interface PersistenceStrategy <T> { void Save(T item); void Remove(T item); bool Exists(T item); } public class CollectionPersistence <T> : PersistenceStrategy <T> { public void Save(T item) { Console. WriteLine( &quot;CollectionPersistence: Save&quot; ); } public void Remove(T item) { Console .WriteLine( &quot;CollectionPersistence: Remove&quot; ); } public bool Exists(T item) { Console .WriteLine( &quot;CollectionPersistence: Exists&quot; ); return false; } }
  • 37. Strategy class Program { static void Main( string [ ] args) { Contact c = new Contact() { Name = &quot;Fernando Kakimoto&quot;, PhoneNumer = &quot;(81)9162-2997&quot;, Email = &quot;nandokakimoto@gmail.com&quot; }; PersistenceStrategy < Contact > persistence = new CollectionPersistence < Contact >(); persistence.Save(c); persistence.Remove(c); persistence.Exists(c); persistence = new DataBasePersistence < Contact >(); persistence.Save(c); persistence.Remove(c); persistence.Exists(c); } } public class DataBasePersistence <T> : PersistenceStrategy <T> { public void Save(T item) { Console .WriteLine( &quot;DataBasePersistence: Save&quot; ); } public void Remove(T item) { Console .WriteLine( &quot;DataBasePersistence: Remove&quot; ); } public bool Exists(T item) { Console .WriteLine( &quot;DataBasePersistence: Exists&quot; ); return false; } }
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 49. Design Patterns com C# Fernando Kakimoto [email_address] www.twitter.com/nandokakimoto

Notes de l'éditeur

  1. Escopo especifica se o padrão é aplicado ao objeto ou a classe. - classe: foca na relação de herança, fixos em tempo de compilação - objeto: foca na interação entre objetos, podendo ser mudados em tempo de execução Creational patterns abstract the object instantiation process: They hide how objects are created and help make the overall system independent of how its objects are created and composed. Structural design patterns are design patterns that ease the design by identifying a simple way to realize relationships between entities.