<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ANSILA A</title>
    <description>The latest articles on DEV Community by ANSILA A (@ansilaabbas).</description>
    <link>https://dev.to/ansilaabbas</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4066836%2Fd0cfaaef-77c0-4180-a882-218281732252.png</url>
      <title>DEV Community: ANSILA A</title>
      <link>https://dev.to/ansilaabbas</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ansilaabbas"/>
    <language>en</language>
    <item>
      <title>Mastering the Strategy Design Pattern in Java: Replace Long if-else Chains with Clean Code</title>
      <dc:creator>ANSILA A</dc:creator>
      <pubDate>Fri, 07 Aug 2026 06:03:04 +0000</pubDate>
      <link>https://dev.to/ansilaabbas/mastering-the-strategy-design-pattern-in-java-replace-long-if-else-chains-with-clean-code-5cf9</link>
      <guid>https://dev.to/ansilaabbas/mastering-the-strategy-design-pattern-in-java-replace-long-if-else-chains-with-clean-code-5cf9</guid>
      <description>&lt;h3&gt;
  
  
  How one simple design pattern can save your codebase from turning into an unmaintainable mess of conditionals
&lt;/h3&gt;




&lt;p&gt;Imagine your application supports five payment methods today — credit card, debit card, UPI, PayPal, and net banking. Your &lt;code&gt;processPayment()&lt;/code&gt; method has five &lt;code&gt;if-else&lt;/code&gt; branches, and life is good. Then marketing decides to add Google Pay. Then Apple Pay. Then "Buy Now, Pay Later." Then a crypto wallet, because why not.&lt;/p&gt;

&lt;p&gt;Six months later, your once-tidy &lt;code&gt;PaymentService&lt;/code&gt; class is a 400-line monster with nested conditionals, duplicated validation logic, and a comment at the top that says &lt;code&gt;// DO NOT TOUCH UNLESS YOU HATE YOURSELF&lt;/code&gt;. Every new payment method means editing this same file, re-testing every existing branch, and praying you didn't break UPI while adding crypto support.&lt;/p&gt;

&lt;p&gt;If this sounds familiar, you've just met the exact problem the &lt;strong&gt;Strategy Design Pattern&lt;/strong&gt; was built to solve.&lt;/p&gt;




&lt;h2&gt;
  
  
  Introduction: Why Design Patterns Exist
&lt;/h2&gt;

&lt;p&gt;Design patterns aren't academic trivia you memorize for interviews and forget the next day. They're &lt;strong&gt;battle-tested solutions to problems that every developer eventually runs into&lt;/strong&gt;, documented so we don't all have to rediscover them the hard way.&lt;/p&gt;

&lt;p&gt;The most common beginner mistake with design patterns isn't misusing them — it's &lt;strong&gt;not knowing when a problem calls for one in the first place&lt;/strong&gt;. New developers tend to solve "add new behavior" problems by adding new &lt;code&gt;if&lt;/code&gt; branches. It works, right up until it doesn't. The codebase becomes rigid, testing becomes painful, and every change carries the risk of breaking something unrelated.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Strategy Pattern&lt;/strong&gt; exists specifically for this situation: when you have a family of related algorithms or behaviors, and you need to switch between them cleanly, without a wall of conditionals standing in your way.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;In one sentence:&lt;/strong&gt; Strategy Pattern lets you define a family of interchangeable algorithms, encapsulate each one, and swap them at runtime — without touching the code that uses them.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What You'll Learn
&lt;/h2&gt;

&lt;p&gt;By the end of this article, you'll understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What the Strategy Pattern is and the problem it solves&lt;/li&gt;
&lt;li&gt;Why long &lt;code&gt;if-else&lt;/code&gt; chains are a code smell, not just an inconvenience&lt;/li&gt;
&lt;li&gt;A complete, working Java implementation from scratch&lt;/li&gt;
&lt;li&gt;How the pattern naturally satisfies key SOLID principles&lt;/li&gt;
&lt;li&gt;Real-world systems that use this pattern every day&lt;/li&gt;
&lt;li&gt;When Strategy Pattern is the wrong choice&lt;/li&gt;
&lt;li&gt;Strategy vs. plain &lt;code&gt;if-else&lt;/code&gt; vs. Factory Pattern&lt;/li&gt;
&lt;li&gt;Common beginner mistakes and how to avoid them&lt;/li&gt;
&lt;li&gt;Interview questions you're likely to be asked about it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's dig in.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: An E-Commerce Payment System
&lt;/h2&gt;

&lt;p&gt;Let's say you're building the checkout flow for an e-commerce platform. At launch, you support two payment methods. Simple enough — a single method with an &lt;code&gt;if-else&lt;/code&gt; block gets the job done.&lt;/p&gt;

&lt;p&gt;Fast forward a year. Your product now supports credit cards, UPI, PayPal, and it's growing. Here's what that code usually starts to look like.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bad Code Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PaymentService&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;processPayment&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;paymentType&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paymentType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equalsIgnoreCase&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CREDIT_CARD"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Validating credit card details..."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Charging ₹"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" to credit card."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Sending confirmation email for credit card payment."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paymentType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equalsIgnoreCase&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"UPI"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Validating UPI ID..."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Charging ₹"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" via UPI."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Sending UPI payment confirmation SMS."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paymentType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equalsIgnoreCase&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"PAYPAL"&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Redirecting to PayPal login..."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Charging ₹"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" via PayPal."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Sending PayPal receipt."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Unsupported payment type: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;paymentType&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At first glance, this doesn't look terrible. But let's break down exactly why this pattern becomes dangerous as your application grows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why This Code Is a Problem
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Tight Coupling&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;PaymentService&lt;/code&gt; knows the implementation details of every single payment method. It shouldn't have to know &lt;em&gt;how&lt;/em&gt; PayPal authentication works or &lt;em&gt;how&lt;/em&gt; UPI validation happens — it should just know "process the payment."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Violates the Open/Closed Principle&lt;/strong&gt;&lt;br&gt;
The &lt;strong&gt;O&lt;/strong&gt; in SOLID states that classes should be &lt;strong&gt;open for extension but closed for modification&lt;/strong&gt;. Every time you add a new payment method, you're forced to modify this existing, already-tested class. That's a violation by definition.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Difficult to Test&lt;/strong&gt;&lt;br&gt;
Unit testing this class means testing &lt;em&gt;every branch&lt;/em&gt; every time, because they all live in the same method. You can't test the PayPal logic in isolation from the credit card logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Difficult to Extend&lt;/strong&gt;&lt;br&gt;
Adding "Google Pay" means opening this file, finding the right spot, adding another &lt;code&gt;else if&lt;/code&gt;, and hoping you don't introduce a typo that silently breaks another branch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Poor Readability at Scale&lt;/strong&gt;&lt;br&gt;
Ten payment methods later, this method is unreadable. Nobody wants to scroll through 300 lines of nested conditionals to understand what happens when a user pays via net banking.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This isn't unique to payments. The same problem shows up in shipping calculators, tax engines, discount logic, notification systems, authentication flows — anywhere you have "one action, many possible behaviors."&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Introducing the Strategy Pattern
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Strategy Pattern&lt;/strong&gt; is a &lt;strong&gt;behavioral design pattern&lt;/strong&gt; that lets you define a family of algorithms, put each one in its own class, and make them interchangeable at runtime through a common interface.&lt;/p&gt;

&lt;p&gt;Instead of asking "which &lt;code&gt;if&lt;/code&gt; branch handles this?", your code asks "which &lt;strong&gt;strategy object&lt;/strong&gt; handles this?" — and calls the exact same method on it, regardless of which one it is.&lt;/p&gt;

&lt;p&gt;The core idea in plain English:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Separate &lt;strong&gt;what varies&lt;/strong&gt; (the algorithm/behavior) from &lt;strong&gt;what stays the same&lt;/strong&gt; (the code that uses it).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The class that uses the strategy (in our case, &lt;code&gt;ShoppingCart&lt;/code&gt;) doesn't need to know &lt;em&gt;which&lt;/em&gt; concrete implementation it's using. It just needs to know that whatever it's holding can &lt;code&gt;pay()&lt;/code&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  UML Diagram
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 ┌────────────────────┐
                 │   PaymentStrategy    │  &amp;lt;&amp;lt;interface&amp;gt;&amp;gt;
                 ├────────────────────┤
                 │ + pay(amount: double)│
                 └──────────▲──────────┘
                             │
        ┌────────────────────┼────────────────────┐
        │                    │                    │
┌───────────────┐   ┌───────────────┐   ┌───────────────┐
│ CreditCardPayment│  │  UPIPayment    │   │ PayPalPayment  │
├───────────────┤   ├───────────────┤   ├───────────────┤
│ + pay(amount)  │   │ + pay(amount)  │   │ + pay(amount)  │
└───────────────┘   └───────────────┘   └───────────────┘

                 ┌────────────────────┐
                 │    ShoppingCart      │
                 ├────────────────────┤
                 │ - strategy: PaymentStrategy │
                 │ + setStrategy(s)      │
                 │ + checkout(amount)    │
                 └────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;ShoppingCart&lt;/code&gt; holds a &lt;strong&gt;reference&lt;/strong&gt; to a &lt;code&gt;PaymentStrategy&lt;/code&gt; — never a concrete class. That reference is what makes swapping behavior at runtime possible.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step-by-Step Java Implementation
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1: Define the Strategy Interface
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;PaymentStrategy&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;pay&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This interface is the &lt;strong&gt;contract&lt;/strong&gt;. Every payment method must implement &lt;code&gt;pay()&lt;/code&gt;. &lt;code&gt;ShoppingCart&lt;/code&gt; will only ever talk to this interface — never to a specific class.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: Implement Concrete Strategies
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CreditCardPayment&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;PaymentStrategy&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cardNumber&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;CreditCardPayment&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;cardNumber&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cardNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cardNumber&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;pay&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Validating credit card ending in "&lt;/span&gt;
                &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;cardNumber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;substring&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cardNumber&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Charged ₹"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" to credit card."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UPIPayment&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;PaymentStrategy&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;upiId&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;UPIPayment&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;upiId&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;upiId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;upiId&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;pay&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Validating UPI ID: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;upiId&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Charged ₹"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" via UPI."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PayPalPayment&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;PaymentStrategy&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;PayPalPayment&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;pay&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Redirecting to PayPal account: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Charged ₹"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" via PayPal."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Each class owns &lt;strong&gt;only its own logic&lt;/strong&gt;. No class knows the others exist.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 3: The Context Class — ShoppingCart
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ShoppingCart&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;PaymentStrategy&lt;/span&gt; &lt;span class="n"&gt;paymentStrategy&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setPaymentStrategy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PaymentStrategy&lt;/span&gt; &lt;span class="n"&gt;paymentStrategy&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;paymentStrategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;paymentStrategy&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;checkout&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;paymentStrategy&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;IllegalStateException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Payment strategy not set!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;paymentStrategy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pay&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This is called the &lt;strong&gt;Context&lt;/strong&gt;. It doesn't know or care &lt;em&gt;how&lt;/em&gt; payment happens — it simply delegates to whatever &lt;code&gt;PaymentStrategy&lt;/code&gt; it currently holds.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 4: Put It All Together
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

        &lt;span class="nc"&gt;ShoppingCart&lt;/span&gt; &lt;span class="n"&gt;cart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ShoppingCart&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="c1"&gt;// Pay using Credit Card&lt;/span&gt;
        &lt;span class="n"&gt;cart&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setPaymentStrategy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CreditCardPayment&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"4111111111111234"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="n"&gt;cart&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;checkout&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2500.00&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="c1"&gt;// Pay using UPI&lt;/span&gt;
        &lt;span class="n"&gt;cart&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setPaymentStrategy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UPIPayment&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ansi@upi"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="n"&gt;cart&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;checkout&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;799.00&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;

        &lt;span class="c1"&gt;// Pay using PayPal&lt;/span&gt;
        &lt;span class="n"&gt;cart&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setPaymentStrategy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PayPalPayment&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ansi@example.com"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
        &lt;span class="n"&gt;cart&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;checkout&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1599.00&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Execution Flow
&lt;/h2&gt;

&lt;p&gt;Here's what actually happens internally when &lt;code&gt;checkout()&lt;/code&gt; is called:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Main
  │
  ▼
ShoppingCart.checkout(amount)
  │
  ▼
paymentStrategy.pay(amount)   ← polymorphic call
  │
  ▼
Actual object determines behavior:
  CreditCardPayment.pay()  OR  UPIPayment.pay()  OR  PayPalPayment.pay()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;ShoppingCart&lt;/code&gt; calls &lt;code&gt;pay()&lt;/code&gt; on an &lt;strong&gt;interface reference&lt;/strong&gt;. Java's dynamic dispatch figures out at runtime which actual class's method to run, based on the object that was assigned via &lt;code&gt;setPaymentStrategy()&lt;/code&gt;. &lt;code&gt;ShoppingCart&lt;/code&gt; itself never branches on payment type — that logic simply doesn't exist there anymore.&lt;/p&gt;




&lt;h2&gt;
  
  
  Output
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Validating credit card ending in 1234
Charged ₹2500.0 to credit card.

Validating UPI ID: ansi@upi
Charged ₹799.0 via UPI.

Redirecting to PayPal account: ansi@example.com
Charged ₹1599.0 via PayPal.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Adding a New Payment Method
&lt;/h2&gt;

&lt;p&gt;Let's say the product team now wants &lt;strong&gt;Google Pay&lt;/strong&gt; support. Here's the entire change required:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GooglePayPayment&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="nc"&gt;PaymentStrategy&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;phoneNumber&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;GooglePayPayment&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;phoneNumber&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;phoneNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;phoneNumber&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="nd"&gt;@Override&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;pay&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Verifying Google Pay account: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;phoneNumber&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Charged ₹"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;" via Google Pay."&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;cart&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setPaymentStrategy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;GooglePayPayment&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"+91-9876543210"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;span class="n"&gt;cart&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;checkout&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;999.00&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice what we &lt;strong&gt;didn't&lt;/strong&gt; touch:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;PaymentStrategy&lt;/code&gt; interface — untouched&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ShoppingCart&lt;/code&gt; — untouched&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CreditCardPayment&lt;/code&gt;, &lt;code&gt;UPIPayment&lt;/code&gt;, &lt;code&gt;PayPalPayment&lt;/code&gt; — untouched&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We only &lt;strong&gt;added&lt;/strong&gt; a new class. Nothing existing was modified, nothing existing needs to be re-tested. That's the entire point of the Open/Closed Principle in action.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Strategy Pattern Follows SOLID Principles
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Open/Closed Principle (OCP)
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Software entities should be open for extension, but closed for modification."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We just proved this directly — &lt;code&gt;GooglePayPayment&lt;/code&gt; extended the system's behavior without modifying a single existing line.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dependency Inversion Principle (DIP)
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;"Depend on abstractions, not concretions."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;code&gt;ShoppingCart&lt;/code&gt; depends on the &lt;code&gt;PaymentStrategy&lt;/code&gt; interface, not on &lt;code&gt;CreditCardPayment&lt;/code&gt; or &lt;code&gt;UPIPayment&lt;/code&gt; directly. High-level modules (&lt;code&gt;ShoppingCart&lt;/code&gt;) and low-level modules (payment implementations) both depend on the abstraction, not on each other.&lt;/p&gt;

&lt;h3&gt;
  
  
  Interface Segregation Principle (ISP)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;PaymentStrategy&lt;/code&gt; exposes exactly one method: &lt;code&gt;pay()&lt;/code&gt;. No implementing class is forced to implement methods it doesn't need — a common problem with bloated "do everything" interfaces. Because the interface is small and focused, ISP is naturally satisfied.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Examples
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;System&lt;/th&gt;
&lt;th&gt;How Strategy Pattern Applies&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google Maps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Switches between driving, walking, cycling, and transit route-calculation strategies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Netflix&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Chooses video quality/encoding strategy based on bandwidth and device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Payment Gateways&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stripe, Razorpay, and similar SDKs swap payment processor logic behind a common interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;File Compression Tools&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ZIP, RAR, and GZIP compression algorithms are interchangeable strategies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Authentication Providers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Swap between OAuth, SAML, or username/password login strategies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Notification Systems&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Send via Email, SMS, or Push Notification using the same &lt;code&gt;notify()&lt;/code&gt; contract&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sorting Algorithms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Java's &lt;code&gt;Collections.sort()&lt;/code&gt; accepts a &lt;code&gt;Comparator&lt;/code&gt; — a textbook Strategy Pattern&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI Model Selection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Systems that route requests to different models (fast vs. accurate) based on context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Shipping Providers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;E-commerce platforms switch between FedEx, DHL, or local courier calculation strategies&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you've ever passed a &lt;code&gt;Comparator&lt;/code&gt; into &lt;code&gt;Collections.sort()&lt;/code&gt;, you've already used the Strategy Pattern — even if nobody called it that at the time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Advantages
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Advantage&lt;/th&gt;
&lt;th&gt;Explanation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Open/Closed Compliant&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Add new behavior without modifying existing code&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Improved Testability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Each strategy can be unit tested in complete isolation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Eliminates Conditional Complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No more sprawling if-else or switch chains&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Runtime Flexibility&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Behavior can be swapped dynamically, even mid-execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Better Separation of Concerns&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Each class has exactly one responsibility&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reusable Algorithms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Strategies can be reused across different contexts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Disadvantages
&lt;/h2&gt;

&lt;p&gt;The Strategy Pattern isn't free — it comes with trade-offs worth being honest about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Increased number of classes.&lt;/strong&gt; Every strategy is its own class. For a system with only two or three simple, stable behaviors, this can be overkill.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client must be aware of strategies.&lt;/strong&gt; Something, somewhere, has to decide which strategy to instantiate — that decision logic doesn't disappear, it just moves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overhead for simple cases.&lt;/strong&gt; If your "algorithm" is a single &lt;code&gt;if-else&lt;/code&gt; with two branches that will never grow, introducing an interface and two classes may be unnecessary ceremony.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;When NOT to use Strategy Pattern:&lt;/strong&gt; If the behavior is genuinely fixed, rarely changes, and has only two simple outcomes, a plain conditional is often more readable than a full pattern implementation. Don't reach for a hammer when a screwdriver will do.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Strategy Pattern vs. Simple if-else
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;if-else Chain&lt;/th&gt;
&lt;th&gt;Strategy Pattern&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Adding new behavior&lt;/td&gt;
&lt;td&gt;Requires modifying existing method&lt;/td&gt;
&lt;td&gt;Add a new class only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Testability&lt;/td&gt;
&lt;td&gt;Hard to isolate individual branches&lt;/td&gt;
&lt;td&gt;Each strategy tested independently&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Readability at scale&lt;/td&gt;
&lt;td&gt;Degrades rapidly&lt;/td&gt;
&lt;td&gt;Stays clean regardless of scale&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coupling&lt;/td&gt;
&lt;td&gt;Tight coupling to all implementations&lt;/td&gt;
&lt;td&gt;Loose coupling via interface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime flexibility&lt;/td&gt;
&lt;td&gt;Static, hardcoded&lt;/td&gt;
&lt;td&gt;Dynamic, swappable at runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best suited for&lt;/td&gt;
&lt;td&gt;2–3 branches that rarely change&lt;/td&gt;
&lt;td&gt;Growing or evolving behavior sets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Strategy Pattern vs. Factory Pattern
&lt;/h2&gt;

&lt;p&gt;These two get confused often, but they solve &lt;strong&gt;different problems&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Factory Pattern&lt;/strong&gt; answers: &lt;em&gt;"How do I create an object?"&lt;/em&gt; It's about &lt;strong&gt;object creation&lt;/strong&gt; — hiding the instantiation logic and returning the right object based on input.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Strategy Pattern&lt;/strong&gt; answers: &lt;em&gt;"How do I choose which behavior to execute?"&lt;/em&gt; It's about &lt;strong&gt;behavior selection&lt;/strong&gt;, assuming you already have the object.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice, they're often used &lt;strong&gt;together&lt;/strong&gt; — a Factory creates the right &lt;code&gt;PaymentStrategy&lt;/code&gt; object, and the Strategy Pattern then determines how &lt;code&gt;checkout()&lt;/code&gt; behaves once that object is injected into &lt;code&gt;ShoppingCart&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PaymentStrategyFactory&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="nc"&gt;PaymentStrategy&lt;/span&gt; &lt;span class="nf"&gt;getStrategy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"CREDIT_CARD"&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;CreditCardPayment&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"4111111111111234"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"UPI"&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;UPIPayment&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ansi@upi"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s"&gt;"PAYPAL"&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;PayPalPayment&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ansi@example.com"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Unknown type: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="o"&gt;};&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the factory still has a conditional — but it's isolated to &lt;strong&gt;one job: creation&lt;/strong&gt;. It never leaks into business logic, and &lt;code&gt;ShoppingCart&lt;/code&gt; remains completely unaware of it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes Beginners Make
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Forgetting the interface entirely.&lt;/strong&gt; Some beginners create multiple strategy classes but skip the shared interface, defeating the entire purpose — the context class ends up doing type-checking again.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Overengineering trivial logic.&lt;/strong&gt; Wrapping a single, permanent, two-branch decision in a full Strategy Pattern setup adds unnecessary indirection for zero benefit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Creating unnecessary strategies.&lt;/strong&gt; Not every varying value needs its own class. If the "algorithm" is really just a different configuration value (like a tax rate), a strategy class is overkill — a simple parameter will do.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Putting business logic in the context class.&lt;/strong&gt; The context (&lt;code&gt;ShoppingCart&lt;/code&gt;) should delegate, not decide. If you find yourself adding &lt;code&gt;if&lt;/code&gt; statements back into the context "just this once," you've undone the pattern's benefit.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Best Practices
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Keep your strategy interface as small as possible — ideally one method. This keeps it flexible and easy to implement.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Favor &lt;strong&gt;composition over inheritance&lt;/strong&gt; — inject strategies rather than subclassing.&lt;/li&gt;
&lt;li&gt;Combine with a &lt;strong&gt;Factory&lt;/strong&gt; when strategy selection logic itself grows complex.&lt;/li&gt;
&lt;li&gt;Use &lt;strong&gt;dependency injection frameworks&lt;/strong&gt; (like Spring) to wire strategies automatically instead of manual &lt;code&gt;new&lt;/code&gt; calls.&lt;/li&gt;
&lt;li&gt;Name strategy classes after &lt;strong&gt;what they do&lt;/strong&gt;, not generic names like &lt;code&gt;Strategy1&lt;/code&gt;, &lt;code&gt;Strategy2&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Keep the &lt;strong&gt;context class ignorant&lt;/strong&gt; of concrete strategy implementations — no casting, no &lt;code&gt;instanceof&lt;/code&gt; checks.&lt;/li&gt;
&lt;li&gt;Write &lt;strong&gt;unit tests per strategy&lt;/strong&gt;, not one giant test covering all branches.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Long &lt;code&gt;if-else&lt;/code&gt; chains for selecting behavior are a code smell that gets worse as your application grows.&lt;/li&gt;
&lt;li&gt;The Strategy Pattern separates &lt;strong&gt;what varies&lt;/strong&gt; (algorithms) from &lt;strong&gt;what stays constant&lt;/strong&gt; (the code using them).&lt;/li&gt;
&lt;li&gt;It's built around a simple interface, multiple concrete implementations, and a context class that delegates.&lt;/li&gt;
&lt;li&gt;It directly supports the &lt;strong&gt;Open/Closed&lt;/strong&gt;, &lt;strong&gt;Dependency Inversion&lt;/strong&gt;, and &lt;strong&gt;Interface Segregation&lt;/strong&gt; principles.&lt;/li&gt;
&lt;li&gt;It's used constantly in real systems — Google Maps, Netflix, payment gateways, and even Java's own &lt;code&gt;Comparator&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;It's not a silver bullet — for genuinely simple, stable logic, a plain conditional can be the better choice.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Every experienced developer has, at some point, inherited a method with a dozen &lt;code&gt;if-else&lt;/code&gt; branches and thought, &lt;em&gt;"there has to be a better way."&lt;/em&gt; The Strategy Pattern is that better way — not because it's clever, but because it's &lt;strong&gt;honest about what changes and what doesn't&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The next time you catch yourself adding "just one more &lt;code&gt;else if&lt;/code&gt;" to a method that already has five, stop. Ask yourself whether you're really writing conditionals, or whether you're describing a family of interchangeable behaviors that deserve their own home.&lt;/p&gt;

&lt;p&gt;Start small. Pick one method in your current project with more than three branches selecting behavior, and refactor it using Strategy Pattern this week. You'll feel the difference the next time a new requirement lands on your desk — and it doesn't make you touch code you already trusted.&lt;/p&gt;

&lt;p&gt;Clean architecture isn't built in a day. It's built one refactor at a time.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>design</category>
      <category>java</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
