Want to Master Java Design Patterns?
Subscribe to Ram N Java for clean code, architecture patterns, and practical Java tutorials!
Subscribe on YouTubeReal-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
ZipCompressionStrategyandRarCompressionStrategycontaining 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
CompressionStrategywithout modifying existing code. - Clean and Readable: Completely eliminates massive conditional
if-elseorswitch-casestatements. - 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
No comments:
Post a Comment