1. Definition
The Proxy Design Pattern provides a surrogate or placeholder for another object to control access to it. The main object is often called the "Real Subject", and the proxy either interfaces its access or provides additional functionalities like lazy initialization, logging, or access control.
2. Problem Statement
Imagine you have a large object, such as a detailed image or a remote database object. Direct operations on the main object can be expensive in terms of computational resources, or you may want to control the access to this object for security reasons.
3. Solution
Using the Proxy pattern, you create an intermediary that can perform additional tasks like lazy loading, logging, and controlling access to the main object, without clients being aware of the proxy's presence.
4. Real-World Use Cases
1. Virtual proxy: Loading an image only when it's required to be displayed.
2. Protection proxy: Controlling access to sensitive methods or databases.
3. Remote proxy: Representing objects that are in different address spaces or servers.
5. Implementation Steps
1. Define an interface that both the RealSubject and Proxy classes will implement.
2. Create the RealSubject class that provides the real operations.
3. Create the Proxy class that maintains a reference to the RealSubject and controls its access or augments its functionalities.
6. Implementation in Swift Programming
// 1. Interface for both RealSubject and Proxy protocol Subject { func request() -> String } // 2. RealSubject class class RealSubject: Subject { func request() -> String { return "RealSubject: Handling request." } } // 3. Proxy class class Proxy: Subject { private lazy var realSubject: RealSubject = RealSubject() func request() -> String { // Proxy can add pre-processing or lazy initialization return "Proxy: Doing some checks...\n" + realSubject.request() + "\nProxy: All done." } } // Client Code let proxy = Proxy() print(proxy.request())
Output:
Proxy: Doing some checks... RealSubject: Handling request. Proxy: All done.
Explanation:
1. Both RealSubject and Proxy adhere to the Subject interface.
2. The Proxy class has a reference to RealSubject but initializes it lazily, only when required.
3. When the client makes a request via the proxy, the proxy can perform additional tasks before/after the real subject performs the actual operation.
7. When to use?
Use the Proxy pattern when:
1. You need to represent a heavy object that consumes vast resources, and you want to delay its loading or initialization.
2. You need to control access to the object based on certain criteria.
3. You want to introduce a layer between your application's core components and external resources, like network communication or file systems.
Design Pattern Related Swift Examples:
Swift Hello World Program Swift Program to Add Two Numbers Swift Program to Subtract Two Numbers Swift Program to Multiply Two Numbers Swift Program to Divide Two Numbers Swift Program to Find Remainder Swift Program to Check Even or Odd Swift Program to Find Factorial of a Number Swift Program to Generate Fibonacci Series Swift Program to Swap Two Numbers Without Using Temporary Variable Swift Program to Find Largest Among Three Numbers Swift Program to Calculate the Area of a Circle Swift Program to Reverse a Number Swift Program to Make a Simple Calculator Swift Program to Check Palindrome Swift Program to Count Number of Digits in an Integer Swift Program to Sum of Natural Numbers Swift Program to Display Times Table Swift Program to Check Prime Number Swift Program to Find LCM Swift Program to Find GCD Swift Program to Find the Power of a Number Swift Program to Split a String into Words Swift Program to Check Leap Year Swift Program to Join Two Strings Swift Program to Check Armstrong Number Swift Program to Find Sum of Array Elements Swift Program to Find the Largest Element of an Array Swift Program to Perform Matrix Addition Swift Program to Transpose a Matrix Swift Program to Multiply Two Matrices Swift Program to Find Length of a String Swift Program to Copy One String to Another String Swift Program to Concatenate Two Strings Swift Program to Search for a Character in a String Swift Program to Count Frequency of a Character in String Swift Program to Create a Simple Class and Object Swift Program to Implement Inheritance Swift Program to Handle Simple Exceptions Swift Variables and Constants Example Swift Data Types (Int, Double, String) Example Swift Optionals and Optional Binding Example Swift Tuples Example Swift Array Example Swift Dictionary Example Swift Set Example Swift Closures Example Swift Enums Example Swift Structures Example Swift Properties (Stored, Computed) Example Swift Methods (Instance, Type) Example Swift Subscripts Example Swift Inheritance and Overriding Example Swift Protocols Example Swift Extensions Example Swift Generics and Generic Functions Example Swift Error Handling with Do-Catch Example Swift Guard Statement Example Swift Defer Statement Example Swift Type Casting (as, is, as?) Example Swift Access Control Example Swift Attributes (@available, @discardableResult) Example Swift Pattern Matching Example Swift Switch Statement and Cases Example Swift For-In Loop Example Swift While and Repeat-While Loops Example Swift Conditional Statements (If, If-Else, Ternary) Example Swift Operators Example Swift Memory Management Example Swift Strong, Weak, and Unowned References Example Swift Initialization and Deinitialization Example Swift Protocol-Oriented Programming Example Swift Nested Types Example Swift Type Aliases Example Swift Dynamic Member Lookup Example Swift Lazy Stored Properties Example Swift KeyPaths Example Swift String Manipulation and Methods Example Swift Regular Expressions Example Swift
Comments
Post a Comment