Showing posts with label File Compression. Show all posts
Showing posts with label File Compression. Show all posts

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
  • Strategy Design pattern - Real Time Example [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

    The Real-World File Compression Dilemma

    In modern software systems, file storage, transfer speeds, and archival needs vary significantly. Consequently, different compression algorithms are favored based on specific priorities:

    • Zip Compression: Highly standard, fast, and supported natively across virtually all operating systems.
    • Rar Compression: Delivers superior compression ratios, making it well-suited for archiving very large data files.
    • 7-Zip / Tar.gz: Preferred in enterprise and Unix environments where maximum compression or preservation of permissions matters.

    If you hardcode these compression algorithms directly into a single file-archiver class using nested conditional logic, the code quickly becomes brittle and difficult to maintain. The Strategy Design Pattern offers an elegant, object-oriented solution.

    Encapsulating File Compression Strategies

    The Strategy pattern defines a family of algorithms, encapsulates each one inside a separate class, and enables them to be swapped dynamically at runtime:

    • CompressionStrategy (Interface): Establishes a standard contract (e.g., compressFiles(List<File> files)) implemented by all compression algorithms.
    • Concrete Strategy Classes: Independent classes like ZipCompressionStrategy and RarCompressionStrategy that encapsulate the algorithm-specific compression routines.
    • CompressionContext (Context): Holds a reference to the active compression strategy and triggers the operation without being coupled to format-specific logic.

    Key Architectural Benefits

    Applying the Strategy pattern to file compression provides major advantages:

    • Open/Closed Principle (OCP): Easily add newer formats (e.g., 7z or Tar.gz) simply by introducing a new strategy class, without changing existing archiver logic.
    • Clean Code: Eliminates lengthy if-else or switch-case blocks responsible for deciding which format to apply.
    • Runtime Adaptability: The application can inspect file types or user settings and dynamically select the optimal compression format on the fly.

    Related Design Pattern Tutorials to Watch Next


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

    Click the below Image to Enlarge
    Strategy Design pattern - Real Time Example [Compress files]


















    See also:

  • Strategy Design pattern - Introduction
  • 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 [Compress files]
  • 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
  • Tutorials