180 likes | 302 Views
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.
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?