{"id":50,"date":"2026-04-19T14:28:28","date_gmt":"2026-04-19T17:28:28","guid":{"rendered":"https:\/\/tiagoiwamoto.com.br\/?p=50"},"modified":"2026-04-19T14:30:02","modified_gmt":"2026-04-19T17:30:02","slug":"entendendo-gof-gang-of-four-e-por-que-ainda-sao-tao-importantes","status":"publish","type":"post","link":"https:\/\/tiagoiwamoto.com.br\/?p=50","title":{"rendered":"Entendendo GoF (Gang of Four) e por que ainda s\u00e3o t\u00e3o importantes"},"content":{"rendered":"\n<p>Se voc\u00ea trabalha com desenvolvimento de software h\u00e1 algum tempo, provavelmente j\u00e1 ouviu falar dos famosos <strong>Design Patterns<\/strong> \u2014 e principalmente do termo <strong>GoF (Gang of Four)<\/strong>.<\/p>\n\n\n\n<p>Mas\u2026 por que isso ainda importa tanto hoje, em um mundo com microservices, cloud, IA e frameworks cada vez mais abstra\u00eddos?<\/p>\n\n\n\n<p>A resposta \u00e9 simples: <strong>problemas cl\u00e1ssicos ainda existem \u2014 e solu\u00e7\u00f5es bem estruturadas continuam sendo valiosas.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udcda O que \u00e9 GoF?<\/h2>\n\n\n\n<p>O termo <strong>GoF (Gang of Four)<\/strong> se refere ao livro cl\u00e1ssico:<\/p>\n\n\n\n<p>\ud83d\udc49 <em>\u201cDesign Patterns: Elements of Reusable Object-Oriented Software\u201d<\/em><\/p>\n\n\n\n<p>Escrito por quatro autores (Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides), esse livro definiu <strong>23 padr\u00f5es de projeto<\/strong> que at\u00e9 hoje s\u00e3o refer\u00eancia no desenvolvimento orientado a objetos.<\/p>\n\n\n\n<p>Esses padr\u00f5es n\u00e3o s\u00e3o c\u00f3digo pronto, mas sim <strong>formas testadas de resolver problemas recorrentes de design<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\ude80 Por que isso ainda \u00e9 relevante?<\/h2>\n\n\n\n<p>Mesmo com frameworks modernos como Spring Boot, Angular, ou arquiteturas baseadas em eventos e cloud:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Voc\u00ea ainda precisa <strong>organizar c\u00f3digo<\/strong><\/li>\n\n\n\n<li>Precisa garantir <strong>baixo acoplamento<\/strong><\/li>\n\n\n\n<li>Precisa facilitar <strong>manuten\u00e7\u00e3o e evolu\u00e7\u00e3o<\/strong><\/li>\n\n\n\n<li>E principalmente: precisa <strong>comunicar bem as solu\u00e7\u00f5es com o time<\/strong><\/li>\n<\/ul>\n\n\n\n<p>\ud83d\udc49 E \u00e9 a\u00ed que os padr\u00f5es brilham.<\/p>\n\n\n\n<p>Eles funcionam como uma <strong>linguagem universal entre desenvolvedores<\/strong>.<\/p>\n\n\n\n<p>Quando voc\u00ea fala:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>\u201cAqui usei Strategy\u201d<\/p>\n<\/blockquote>\n\n\n\n<p>Outro dev experiente j\u00e1 entende a ideia \u2014 sem precisar ler toda a implementa\u00e7\u00e3o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udde9 Categorias de padr\u00f5es GoF<\/h2>\n\n\n\n<p>Os padr\u00f5es do GoF s\u00e3o divididos em tr\u00eas grandes grupos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Criacionais<\/strong> \u2192 cria\u00e7\u00e3o de objetos<\/li>\n\n\n\n<li><strong>Estruturais<\/strong> \u2192 organiza\u00e7\u00e3o entre classes<\/li>\n\n\n\n<li><strong>Comportamentais<\/strong> \u2192 comunica\u00e7\u00e3o e comportamento entre objetos<\/li>\n<\/ul>\n\n\n\n<p>\ud83d\udc49 E \u00e9 exatamente aqui que vamos come\u00e7ar.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83c\udfaf O foco deste post: padr\u00f5es comportamentais<\/h2>\n\n\n\n<p>Neste primeiro post, vamos explorar tr\u00eas padr\u00f5es comportamentais extremamente \u00fateis no dia a dia:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd01 Strategy<\/h3>\n\n\n\n<p>Permite trocar algoritmos de forma din\u00e2mica.<\/p>\n\n\n\n<p>\ud83d\udc49 Ideal quando voc\u00ea tem v\u00e1rias formas de executar uma mesma opera\u00e7\u00e3o.<\/p>\n\n\n\n<p>Exemplo cl\u00e1ssico:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Diferentes formas de c\u00e1lculo (frete, desconto, imposto)<\/li>\n<\/ul>\n\n\n\n<p>Abaixo um exemplo utilizando o spring boot, note que dessa forma basta que eu crie novas classes e elas s\u00e3o inclu\u00eddas na minha lista de forma din\u00e2mica e com isso eu n\u00e3o quebro o Open Closed do SOLID e deixo meu c\u00f3digo muito mais organizado<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">public interface MissaoStrategy {<br><br>    void execute(MissaoDto missaoDto);<br>    Boolean apply(MissaoDto missaoDto);<br><br>}<\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>public class MissaoPsnStrategy implements MissaoStrategy{\n    @Override\n    public void execute(MissaoDto missaoDto) {\n\n    }\n\n    @Override\n    public Boolean apply(MissaoDto missaoDto) {\n        return missaoDto.missao().equalsIgnoreCase(\"psn\")\n                &amp;&amp; missaoDto.type().equalsIgnoreCase(\"valor\");\n    }\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>public class MissaoNetflixStrategy implements MissaoStrategy{\n    @Override\n    public void execute(MissaoDto missaoDto) {\n\n    }\n\n    @Override\n    public Boolean apply(MissaoDto missaoDto) {\n        return missaoDto.missao().equalsIgnoreCase(\"netflix\")\n                &amp;&amp; missaoDto.type().equalsIgnoreCase(\"valor\");\n    }\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>@Service\n@RequiredArgsConstructor\n@Slf4j\npublic class StrategyServiceApp {\n\n    private final List&lt;MissaoStrategy> missaoStrategies;\n\n    public void pontuar(MissaoDto missaoDto){\n        var missao = missaoStrategies.stream()\n                .filter(missaoStrategy -> missaoStrategy.apply(missaoDto))\n                .findFirst()\n                .orElseThrow(() -> new RuntimeException(\"Miss\u00e3o selecionada \u00e9 inv\u00e1lida.\"));\n        log.debug(\"missao selecionada: {}\", missao.getClass().getSimpleName());\n        missao.execute(missaoDto);\n    }\n\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udc40 Observer<\/h3>\n\n\n\n<p>Define um mecanismo de <strong>notifica\u00e7\u00e3o entre objetos<\/strong>.<\/p>\n\n\n\n<p>\ud83d\udc49 Muito usado em sistemas orientados a eventos.<\/p>\n\n\n\n<p>Exemplo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Um servi\u00e7o publica um evento e v\u00e1rios consumidores reagem a ele<\/li>\n<\/ul>\n\n\n\n<p>Abaixo um exemplo utilizando o spring boot, note que dessa forma basta que eu crie novas classes e elas s\u00e3o notificadas de forma que uma n\u00e3o interfere na outra mesmo com regras totalmente diferentes<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Service\n@RequiredArgsConstructor\npublic class ObserverServiceApp {\n\n    private final ApplicationEventPublisher eventPublisher;\n\n    void notificarMissaoConcluida(Evento evento){\n        eventPublisher.publishEvent(evento);\n    }\n\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>@Service\n@RequiredArgsConstructor\n@Slf4j\npublic class EventoNotificarFornecedorAsdf {\n\n    @EventListener\n    void handle(Evento evento){\n        log.debug(\"Notificando fornecedor Asdf: {}\", evento);\n    }\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>@Service\n@RequiredArgsConstructor\n@Slf4j\npublic class EventoNotificarFornecedorXpto {\n\n    @EventListener\n    void handle(Evento evento){\n        log.debug(\"Notificando fornecedor Xpto: {}\", evento);\n    }\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\ud83d\udd17 Chain of Responsibility<\/h3>\n\n\n\n<p>Permite processar uma requisi\u00e7\u00e3o passando por uma cadeia de handlers.<\/p>\n\n\n\n<p>\ud83d\udc49 Cada etapa decide se trata ou passa adiante.<\/p>\n\n\n\n<p>Exemplo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Valida\u00e7\u00f5es em pipeline<\/li>\n\n\n\n<li>Filtros de autentica\u00e7\u00e3o\/autoriza\u00e7\u00e3o<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udca1 Por que come\u00e7ar pelos comportamentais?<\/h2>\n\n\n\n<p>Porque eles est\u00e3o <strong>em todo lugar<\/strong> hoje:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Event-driven architecture \u2192 Observer<\/li>\n\n\n\n<li>Pipelines e middlewares \u2192 Chain<\/li>\n\n\n\n<li>Estrat\u00e9gias din\u00e2micas \u2192 Strategy<\/li>\n<\/ul>\n\n\n\n<p>\ud83d\udc49 Ou seja: mesmo que voc\u00ea n\u00e3o perceba, j\u00e1 est\u00e1 usando esses padr\u00f5es.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udccc O que vem nos pr\u00f3ximos posts?<\/h2>\n\n\n\n<p>Este \u00e9 s\u00f3 o come\u00e7o.<\/p>\n\n\n\n<p>Nos pr\u00f3ximos posts, vamos aprofundar:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\ud83c\udfd7\ufe0f <strong>Padr\u00f5es Criacionais<\/strong> (Factory, Builder, Singleton\u2026)<\/li>\n\n\n\n<li>\ud83e\uddf1 <strong>Padr\u00f5es Estruturais<\/strong> (Adapter, Facade, Decorator\u2026)<\/li>\n<\/ul>\n\n\n\n<p>Sempre com exemplos pr\u00e1ticos e aplicados ao mundo real (Java, cloud, arquitetura moderna, etc).<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udde0 Conclus\u00e3o<\/h2>\n\n\n\n<p>Os padr\u00f5es GoF n\u00e3o s\u00e3o \u201cvelhos\u201d \u2014 eles s\u00e3o <strong>fundamentais<\/strong>.<\/p>\n\n\n\n<p>Eles ajudam voc\u00ea a:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>escrever c\u00f3digo mais limpo<\/li>\n\n\n\n<li>tomar decis\u00f5es melhores de arquitetura<\/li>\n\n\n\n<li>e evoluir sistemas com mais seguran\u00e7a<\/li>\n<\/ul>\n\n\n\n<p>\ud83d\udc49 No fim das contas, n\u00e3o \u00e9 sobre decorar padr\u00f5es\u2026<br>\u00e9 sobre <strong>reconhecer problemas e aplicar boas solu\u00e7\u00f5es<\/strong>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se voc\u00ea trabalha com desenvolvimento de software h\u00e1 algum tempo, provavelmente j\u00e1 ouviu falar dos famosos Design Patterns \u2014 e principalmente do termo GoF (Gang of Four). Mas\u2026 por que isso ainda importa tanto hoje, em um mundo com microservices, cloud, IA e frameworks cada vez mais abstra\u00eddos? A resposta \u00e9 simples: problemas cl\u00e1ssicos ainda&#8230;<\/p>\n","protected":false},"author":1,"featured_media":54,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"categories":[2],"tags":[11,4],"class_list":["post-50","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev","tag-gof","tag-java"],"_links":{"self":[{"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/50","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=50"}],"version-history":[{"count":3,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/50\/revisions"}],"predecessor-version":[{"id":53,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/50\/revisions\/53"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=\/wp\/v2\/media\/54"}],"wp:attachment":[{"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=50"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=50"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tiagoiwamoto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=50"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}