180 likes | 307 Vues
In this lecture, we explore the Adapter Pattern through real-world examples like electrical outlets, illustrating how it allows different systems to work together without modifying their existing implementation. Using the Adapter Pattern, we can adapt incompatible interfaces, maintaining the functionality of original code while enabling it to interact with new types. We also delve into practical implementations, such as adapting dimensions for sorting algorithms, ensuring compatibility without sacrificing performance.
E N D
Computer Science 313 – Advanced Programming Topics Lecture 25:Adapter Pattern
Real-World Problems • Have one thing, but need something different • Try & make it work despite not being correct • But this often leads to problems
Outlets Around the World • 2 standards for electric transmission • Japan & the Americas use 110 volt • 220 volts used by Europe, (rest of) Asia, & Africa • Variety of incompatible plugs defined by each
Play With Electricity for Fun! • Do not want new appliance for each country • First thought: jam single plug into wall • Plug interface only difference between them
Play With Electricity for Fun! • Do not want new appliance for each country • First thought: jam single plug into wall • Plug interface only difference between them
Play With Electricity for Fun! • Do not want new appliance for each country • First thought: jam single plug into wall • Plug interface only difference between them • Generally speaking, this is not a good idea • Use plug adapter as an alternate approach • Plug then good to use in existing outlets now
Adapter Pattern Workings • Like plug adapters, but used with existing code • Starts with some existing plug (instance) • Need it to match a preexisting outlet (interface) • Do not want big changes; functionality stays same • Change what is exposed by wrapping plug
Adapter Pattern Intent • Makes existing class use client's interface • Otherwise compatible classes now work together • Work is invisible to client code • Goal of pattern is client code is not modified • No changes to functionality with this pattern • If we want real changes use Decorator pattern • Does not need to expose full functionality • Have not discussed what plug attached to!
Adapter Pattern Example • Already wrote class sorting an array public interface Comparable<T> {public intcompareTo(T other); } public class QuickSort {static void <T extends Comparable<T>> sort(T[] array) { // Sorts this array} }
Points on a Plane • Must sort, but Dimensions not Comparable • Rewrite QuickSortto use Dimensions • Dimensionclosed to modification & inheritance • Do not want to rerun tests on Dimension, anyway • Adapter does this without violating laziness principle • Two ways to do this with Adapter pattern • Hide object, via Object adapter using composition • Class adapter uses inheritance, but reuse limited
Object Adapter class ComparableDimensionimplements Comparable<ComparableDimension> {private Dimension d; // Object being adaptedpublic ComparableDimension(Dimension newD) {d = newD;}public intcompareTo(ComparableDimension o) { Integer myArea = d.height * d.width; Integer oArea = o.d.height * o.d.width; return myArea.compareTo(oArea);} }
Class Adapter class ComparableDimensionextends Dimensionimplements Comparable<ComparableDimension> {public ComparableDimension(int h, int w) {super(h, w);}public intcompareTo(ComparableDimension o) { Integer myArea = d.height * d.width; Integer oArea = o.d.height * o.d.width; return myArea.compareTo(oArea);} }
How Example Works • ImplementingComparableDimension either way • Is-a or Has-a Dimensionto compare • Comparableinterface is implemented • Can be used by QuickSortclass
Class Adapter UML Diagram • Adapterextends Target & is-aAdaptee • Not very easy in Java • Client, Target & Adapteealready exist • Only Adapter created or edited to do this
Class Adapter UML Diagram • Adapterextends Target & is-aAdaptee • Not very easy in Java • Client, Target & Adapteealready exist • Only Adapter created or edited to do this
Object Adapter UML Diagram • Adapterextends Target & has-aAdaptee • No multiple inheritance, so legal in Java • Client, Target & Adapteealready exist • Only Adapter created or edited to do this
Object Adapter UML Diagram • Adapterextends Target & has-aAdaptee • No multiple inheritance, so legal in Java • Client, Target & Adapteealready exist • Only Adapter created or edited to do this
For Next Class • Lab #6 available on Angel • Assignment due before we go on break • Will discuss Façade pattern on Wednesday • How does this differ from Adapter? • What is important when discussing patterns? • What is the most “Hollywood” of patterns?