180 likes | 309 Vues
The Adapter Pattern allows existing classes to work with incompatible interfaces by wrapping one class with another. This lecture explores the practical challenges faced, such as different electrical standards globally, and how to create solutions without altering existing code. By leveraging the Adapter Pattern, we can integrate functionality seamlessly while keeping the original interfaces intact. This method can be applied to diverse scenarios, such as adapting sorting algorithms for non-comparable objects without modifying their internal structures.
E N D
Computer Science 313 – Advanced Programming Topics Lecture 26: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 (or most sane languages) • 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 #5 due on Friday before next lab starts • Get it working while you can still earn credit • 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?