Adapter Pattern

/* * Adapter Pattern(适配器模式) * 这个模式主要对两个不同的接口或类通过适配器来转变,使其对客户端不产生影响,在两个类中增加一个层次; * 一个通俗点例子: * usb转接口,通过usb转接口(适配器),可以将usb接口转接成ps/2接口(目标接口),这样,既不用换鼠标,也不用 * 变化电脑接口,只需增加一个转接就ok。 * 通常Adapter Pattern 有几个关键类: * 1)Adapter 类,用于将原来的接口转换到客户需要的目标(target)接口 * 2)target类,目标接口/类。 * 3)Adaptee类,原来的接口,需要拿去被转接。 * * 在这个模式当中,使用时在Adapter类中,入口是Adaptee(旧接口),在Adapter类中利用原来接口实现(新)目标接口; * 这个模式有两种形式: * 1)类适配器模式,利用的是类多继承来实现,在java中利用接口implementation来实现 * 2)对象适配器模式,利用的是composition组合形式实现,这种形式是可以动态转换接口方式,更常用。 * * 下面我自己写的一个简单例子,client是客户代码,测试参数是一个Mystack,利用StackAdapter来把Myqueue“适配成" * MyStack,这样代码不需要动,只需增加一个适配层就ok。 */ import java.util.*; class MyStack{ private Vector myVec; public MyStack(){ myVec = new Vector(); } public void push(int i){ System.out.println("push() "+i); myVec.addElement(i); } public int pop(){ if(myVec.size() == 0) return -1; //简单错误处理 int ret; Integer i = (Integer)myVec.get(myVec.size()-1); ret = i.intValue(); System.out.println("pop() "+ret); myVec.remove(myVec.size()-1); return ret; } public void print(){ System.out.println("--------------print Stack---------------"); for(int i = 0;i<myVec.size();i++) { System.out.println(i + " : "+myVec.get(i)); } } public int size(){ return myVec.size(); } } class MyQueue{ private Vector myVec; public MyQueue(){ myVec = new Vector(); } public void push(int i){ System.out.println("push() "+i); myVec.add(i); } public int pop(){ if(myVec.size() == 0) return -1; //简单错误处理 int ret; Integer i = (Integer)myVec.get(0); ret = i.intValue(); System.out.println("pop() "+ret); myVec.remove(0); return ret; } public void print(){ System.out.println("--------------print Queue---------------"); for(int i = 0;i<myVec.size();i++) { System.out.println(i + " : "+myVec.get(i)); } } public int size(){ return myVec.size(); } } class Client{ public void testStack(MyStack ms){ ms.push(1); ms.push(2); ms.push(3); ms.print(); ms.pop(); ms.print(); ms.push(4); ms.print(); } } class StackAdapter extends MyStack{ private MyQueue myq; public StackAdapter(MyQueue q){ myq = q; } public void push(int i){ myq.push(i); } public int pop(){ Vector vecTmp = new Vector(); while(myq.size() != 0) { vecTmp.add(myq.pop()); } for(int i = 0;i<vecTmp.size()-1;i++) { Integer I = (Integer)vecTmp.get(i); myq.push(I.intValue()); } Integer I = (Integer)vecTmp.get(vecTmp.size()-1); int ret = I.intValue(); vecTmp.clear(); return ret; } public int size(){ return myq.size(); } public void print(){ myq.print(); } } public class TestAdapter { /** * @param args */ public static void main(String[] args) { // TODO 自动生成方法存根 MyStack s = new MyStack(); MyQueue q = new MyQueue(); MyStack sa = new StackAdapter(q); Client c = new Client(); c.testStack(sa); } }

你可能感兴趣的:(Adapter Pattern)