Tuesday, 24 December 2013

Strategy Design pattern - Implementation [Compress files]

Want to Master Java Design Patterns?

Subscribe to Ram N Java for clean code, architecture patterns, and practical Java tutorials!

Subscribe on YouTube

Real-World Scenario: File Compression

When developing applications that store or transfer large volumes of files, compressing files is a critical requirement. Different formats serve different needs:

  • Zip Compression: Universally supported and fast across almost all platforms.
  • Rar Compression: Delivers high compression ratios for archiving large assets.
  • 7z / Tar.gz: Popular choices in modern developer environments and Unix systems.

Hardcoding these compression techniques inside a file archiver class makes your application rigid and violates object-oriented design principles. The Strategy Design Pattern solves this problem by encapsulating each compression technique into an independent, interchangeable class.

Key Components of the Architecture

  • CompressionStrategy (Interface): Declares a contract method such as compress(List<File> files) shared across all algorithms.
  • Concrete Strategy Classes: Specific implementations like ZipCompressionStrategy and RarCompressionStrategy containing format-specific algorithms.
  • CompressionContext (Context): Maintains a reference to the active compression strategy and triggers the compression workflow without needing to know implementation details.

Java Code Walkthrough

1. Define the Common Strategy Interface:

import java.io.File;
import java.util.List;

public interface CompressionStrategy {
    void compressFiles(List<File> files);
}

2. Implement Concrete Strategies:

public class ZipCompressionStrategy implements CompressionStrategy {
    @Override
    public void compressFiles(List<File> files) {
        System.out.println("Compressing files using ZIP compression format...");
    }
}

public class RarCompressionStrategy implements CompressionStrategy {
    @Override
    public void compressFiles(List<File> files) {
        System.out.println("Compressing files using RAR compression format...");
    }
}

3. Configure the Context Class:

public class CompressionContext {
    private CompressionStrategy compressionStrategy;

    public void setCompressionStrategy(CompressionStrategy compressionStrategy) {
        this.compressionStrategy = compressionStrategy;
    }

    public void createArchive(List<File> files) {
        compressionStrategy.compressFiles(files);
    }
}

Why This Design Pattern Works Best

  • Open/Closed Principle (OCP): Need to introduce 7-Zip or GZip? Just create a new class implementing CompressionStrategy without modifying existing code.
  • Clean and Readable: Completely eliminates massive conditional if-else or switch-case statements.
  • Dynamic Selection: Your application can choose the ideal compression format at runtime based on user preference or file type.

Related Design Pattern Tutorials to Watch Next


Click here to watch in Youtube : https://www.youtube.com/watch?v=CbBQQ06OcOo

Click the below Image to Enlarge
Strategy Design pattern - Implementation [Compress files]

Strategy Design pattern - Implementation [Compress files] - Class Diagram


































CompressionStrategy.java

import java.io.File;
import java.util.ArrayList;

public interface CompressionStrategy
{
public void compressFiles( ArrayList<File> files,String compressedArchiveFileName );
}


ZipCompressionStrategy.java

import java.io.File;
import java.util.ArrayList;

public class ZipCompressionStrategy implements CompressionStrategy
{

public void compressFiles( ArrayList<File> files, String compressedArchiveFileName )
{
System.out.println("Files are compressed using zip approach: '" + compressedArchiveFileName
               + ".zip' file is created");
}

}

RarCompressionStrategy.java

import java.io.File;
import java.util.ArrayList;

public class RarCompressionStrategy implements CompressionStrategy
{

public void compressFiles( ArrayList<File> files, String compressedArchiveFileName )
{
System.out.println("Files are compressed using Rar approach: '" + compressedArchiveFileName
               + ".rar' file is created");
}

}

CompressionContext.java

import java.io.File;
import java.util.ArrayList;

public class CompressionContext
{
private CompressionStrategy strategy;

//Client will set what CompressionStrategy to use by calling this method
public void setCompressionStrategy( CompressionStrategy strategy )
{
this.strategy = strategy;
}

public void createArchive( ArrayList<File> files,String compressedArchiveFileName )
{
strategy.compressFiles(files,compressedArchiveFileName);
}

}

Client.java

import java.io.File;
import java.util.ArrayList;

public class Client
{

public static void main( String[] args )
{

ArrayList<File> fileList = new ArrayList<File>();
fileList.add(new File("D:\\Javafiles\\Javadoc.txt"));
fileList.add(new File("D:\\Javafiles\\Release.txt"));

CompressionContext ctx = null;

ctx = new CompressionContext();
ctx.setCompressionStrategy(new ZipCompressionStrategy());
ctx.createArchive(fileList,"Javafiles");

ctx = new CompressionContext();
ctx.setCompressionStrategy(new RarCompressionStrategy());
ctx.createArchive(fileList,"Javafiles");

}
}

Output

Files are compressed using zip approach: 'Javafiles.zip' file is created
Files are compressed using Rar approach: 'Javafiles.rar' file is created


See also:


  • Strategy Design pattern - Introduction
  • Strategy Design pattern - Real Time Example [Compress files]
  • Strategy Design pattern - Real Time Example [Payment]
  • Strategy Design pattern - Real Time Example [Travel]
  • Strategy Design pattern - Real Time Example [Sorting]
  • Strategy Design pattern - Real Time Example [Search]
  • Strategy Design pattern - Class Diagram
  • Strategy Design pattern - Sequence Diagram
  • Strategy Design pattern - Implementation [Travel]
  • Strategy Design pattern - Implementation [Payment]
  • Strategy Design pattern - Implementation [Search]
  • Strategy Design pattern - Implementation [Sort]
  • Strategy Design pattern - KeyPoints
  • All Design Patterns Links
  • No comments:

    Post a Comment

    Tutorials