adapter pattern ali zonoozi design patterns course advisor: dr. noorhoseini winter 2010

27
ADAPTER PATTERN Ali Zonoozi Design patterns course Advisor: Dr. Noorhoseini Winter 2010

Post on 21-Dec-2015

217 views

Category:

Documents


0 download

TRANSCRIPT

ADAPTER PATTERNAli ZonooziDesign patterns courseAdvisor: Dr. Noorhoseini

Winter 2010

Amirkabir University of Technoloy Computer Engineering Department

Design Patterns presentation: Adapter pattern

Winter 2010

Intent Convert the interface of a class into

another interface clients expect. Adapter lets classes work together that

couldn't otherwise because of incompatible interfaces.

Wrap an existing class with a new interface.

Also Known As-> Wrapper

slide 2

Amirkabir University of Technoloy Computer Engineering Department

Design Patterns presentation: Adapter pattern

Winter 2010

Motivation Sometimes a toolkit or class library can

not be used because its interface is incompatible with the interface required by an application

We can not change the library interface, since we may not have its source code

Even if we did have the source code, we probably should not change the library for each domain-specific application

slide 3

Amirkabir University of Technoloy Computer Engineering Department

Design Patterns presentation: Adapter pattern

Winter 2010

Motivation Example:

slide 4

Amirkabir University of Technoloy Computer Engineering Department

Design Patterns presentation: Adapter pattern

Winter 2010

Participants Target (shape)

defines the domain-specific interface that Client uses.

Adapter (TextShape) adapts the interface Adaptee to the Target

interface. Adaptee (TextView)

defines an existing interface that needs adapting. Client (DrawingEditor)

collaborates with objects conforming to the Target interface.

slide 5

Amirkabir University of Technoloy Computer Engineering Department

Design Patterns presentation: Adapter pattern

Winter 2010

Structure A class adapter uses multiple

inheritance to adapt one interface to another:

slide 6

Amirkabir University of Technoloy Computer Engineering Department

Design Patterns presentation: Adapter pattern

Winter 2010

Structure An object adapter relies on object

composition:

slide 7

Amirkabir University of Technoloy Computer Engineering Department

Design Patterns presentation: Adapter pattern

Winter 2010

Collaboration

slide 8

Amirkabir University of Technoloy Computer Engineering Department

Design Patterns presentation: Adapter pattern

Winter 2010

ApplicabilityUse the Adapter pattern when You want to use an existing class, and

its interface does not match the one you need

You want to create a reusable class that cooperates with unrelated classes with incompatible interfaces

slide 9

Amirkabir University of Technoloy Computer Engineering Department

Design Patterns presentation: Adapter pattern

Winter 2010

Implementation How much adapting should be done?

Simple interface conversion that just changes operation names and order of arguments

Totally different set of operations Does the adapter provide two-way

transparency? A two-way adapter supports both the

Target and the Adaptee interface. It allows an adapted object (Adapter) to appear as an Adaptee object or a Target object

slide 11

Amirkabir University of Technoloy Computer Engineering Department

slide 13

Design Patterns presentation: Adapter pattern

Winter 2010

Example 1 The classic round pegs and square pegs! Here's the SquarePeg class:/** * The SquarePeg class. * This is the Target class. */ public class SquarePeg { public void insert(String str) { System.out.println("SquarePeg insert(): " + str); } }

Amirkabir University of Technoloy Computer Engineering Department

slide 14

Design Patterns presentation: Adapter pattern

Winter 2010

Example 1 (continued) And the RoundPeg class: /** * The RoundPeg class. * This is the Adaptee class. */ public class RoundPeg { public void insertIntoHole(String msg) { System.out.println("RoundPeg insertIntoHole(): " + msg); } }If a client only understands the SquarePeg interface for insertingpegs using the insert() method, how can it insert round pegs? Apeg adapter!

Amirkabir University of Technoloy Computer Engineering Department

slide 15

Design Patterns presentation: Adapter pattern

Winter 2010

Example 1 (continued) Here is the PegAdapter class: /** * The PegAdapter class. * This is the Adapter class. * It adapts a RoundPeg to a SquarePeg. * Its interface is that of a SquarePeg. */ public class PegAdapter extends SquarePeg { private RoundPeg roundPeg; public PegAdapter(RoundPeg peg) {this.roundPeg = peg;} public void insert(String str) {roundPeg.insertIntoHole(str);} }

Amirkabir University of Technoloy Computer Engineering Department

slide 16

Design Patterns presentation: Adapter pattern

Winter 2010

Example 1 (continued) Typical client program:// Test program for Pegs. public class TestPegs { public static void main(String args[]) { // Create some pegs. RoundPeg roundPeg = new RoundPeg(); SquarePeg squarePeg = new SquarePeg(); // Do an insert using the square peg. squarePeg.insert("Inserting square peg...");

Amirkabir University of Technoloy Computer Engineering Department

slide 17

Design Patterns presentation: Adapter pattern

Winter 2010

Example 1 (continued)// Now we'd like to do an insert using the round peg. // But this client only understands the insert() // method of pegs, not a insertIntoHole() method. // The solution: create an adapter that adapts // a square peg to a round peg! PegAdapter adapter = new PegAdapter(roundPeg); adapter.insert("Inserting round peg..."); } } Client program output: SquarePeg insert(): Inserting square peg... RoundPeg insertIntoHole(): Inserting round peg...

Amirkabir University of Technoloy Computer Engineering Department

Design Patterns presentation: Adapter pattern

Winter 2010

Example 2 Consider that we have a third party library that provides sorting

functionality through it's NumberSorter class. This is our Adaptee/* * This is our adaptee, a third party implementation of a * number sorter that deals with Lists, not arrays.*/public class NumberSorter{

public List<Integer> sort(List<Integer> numbers){//sort and returnreturn new ArrayList<Integer>();}

}

slide 18

Amirkabir University of Technoloy Computer Engineering Department

Design Patterns presentation: Adapter pattern

Winter 2010

Example 2 (continued) Our Client deals with primitive arrays rather than

Lists. For the sake of this example, lets say we can't change the client to use Lists.

We've provided a Sorter interface that expects the client input. This is our target.

//this is our Target interfacepublic interface Sorter{public int[] sort(int[] numbers);}

slide 19

Amirkabir University of Technoloy Computer Engineering Department

Design Patterns presentation: Adapter pattern

Winter 2010

Example 2 (continued) Finally, the SortListAdapter implements our target interface and deals

with our adaptee, NumberSorterpublic class SortListAdapter implements Sorter{

@Overridepublic int[] sort(int[] numbers){

//convert the array to a ListList<Integer> numberList = new ArrayList<Integer>();//call the adapter NumberSorter sorter = new NumberSorter();numberList = sorter.sort(numberList);//convert the list back to an array and return return sortedNumbers;

}}

slide 20

Amirkabir University of Technoloy Computer Engineering Department

Design Patterns presentation: Adapter pattern

Winter 2010

Example 2 (Continued)int[] numbers = new int[]{34, 2, 4, 12, 1};Sorter sorter = new SortListAdapter();sorter.sort(numbers);

slide 21

Amirkabir University of Technoloy Computer Engineering Department

slide 22

Design Patterns presentation: Adapter pattern

Winter 2010

Example 3 Notice in Example 1 that the PegAdapter

adapts a RoundPeg to a SquarePeg. The interface for PegAdapter is that of a SquarePeg.

What if we want to have an adapter that acts as a SquarePeg or a RoundPeg? Such an adapter is called a two-way adapter.

One way to implement two-way adapters is to use multiple inheritance, but we can't do this in Java

But we can have our adapter class implement two different Java interfaces!

Amirkabir University of Technoloy Computer Engineering Department

slide 23

Design Patterns presentation: Adapter pattern

Winter 2010

Example 3 (continued) Here are the interfaces for round and square pegs: /** *The IRoundPeg interface. */ public interface IRoundPeg { public void insertIntoHole(String msg); } /** *The ISquarePeg interface. */ public interface ISquarePeg { public void insert(String str); }

Amirkabir University of Technoloy Computer Engineering Department

slide 24

Design Patterns presentation: Adapter pattern

Winter 2010

Example 3 (continued) Here are the new RoundPeg and SquarePeg classes. These are

essentially the same as before except they now implement the appropriate interface.

// The RoundPeg class. public class RoundPeg implements IRoundPeg { public void insertIntoHole(String msg) { System.out.println("RoundPeg insertIntoHole(): " + msg); } } // The SquarePeg class. public class SquarePeg implements ISquarePeg { public void insert(String str) { System.out.println("SquarePeg insert(): " + str); } }

Amirkabir University of Technoloy Computer Engineering Department

slide 25

Design Patterns presentation: Adapter pattern

Winter 2010

Example 3 (continued) And here is the new PegAdapter: /** * The PegAdapter class. * This is the two-way adapter class. */ public class PegAdapter implements ISquarePeg, IRoundPeg { private RoundPeg roundPeg; private SquarePeg squarePeg; public PegAdapter(RoundPeg peg) {this.roundPeg = peg;} public PegAdapter(SquarePeg peg) {this.squarePeg = peg;} public void insert(String str) {roundPeg.insertIntoHole(str);} public void insertIntoHole(String msg){squarePeg.insert(msg);} }

Amirkabir University of Technoloy Computer Engineering Department

slide 26

Design Patterns presentation: Adapter pattern

Winter 2010

Example 3 (continued) A client that uses the two-way adapter: // Test program for Pegs. public class TestPegs { public static void main(String args[]) { // Create some pegs. RoundPeg roundPeg = new RoundPeg(); SquarePeg squarePeg = new SquarePeg(); // Do an insert using the square peg. squarePeg.insert("Inserting square peg..."); // Create a two-way adapter and do an insert with it. ISquarePeg roundToSquare = new PegAdapter(roundPeg); roundToSquare.insert("Inserting round peg...");

Amirkabir University of Technoloy Computer Engineering Department

slide 27

Design Patterns presentation: Adapter pattern

Winter 2010

Example 3 (continued) // Do an insert using the round peg. roundPeg.insertIntoHole("Inserting round peg..."); // Create a two-way adapter and do an insert with it. IRoundPeg squareToRound = new PegAdapter(squarePeg); squareToRound.insertIntoHole("Inserting square peg..."); } } Client program output: SquarePeg insert(): Inserting square peg... RoundPeg insertIntoHole(): Inserting round peg... RoundPeg insertIntoHole(): Inserting round peg... SquarePeg insert(): Inserting square peg...

Amirkabir University of Technoloy Computer Engineering Department

Design Patterns presentation: Adapter pattern

Winter 2010

Related Patterns The Bridge pattern shares structure with

object adapter, but diverges on intent. Bridge is concerned with separating an object's interface from its implementation while adapter changes the interface of an existing object

The Decorator pattern does not change an object's interface, but it does support recursive composition which adapter does not. In this way, Decorator is more flexible than adapter for dealing with functionality additions

slide 28

Amirkabir University of Technoloy Computer Engineering Department

Design Patterns presentation: Adapter pattern

Winter 2010

Questions?

slide 29