结构型模式7之2-Adapter适配器模式例子理解

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。
例子一(对象适配器模式):
1。Apple

package com.test.adaptermodel;

public class Apple {
    public void getAColor(String str) {
        System.out.println("Apple color is: " + str);
    }
}

2.Orange

package com.test.adaptermodel;

public class Orange {
    public void getOColor(String str) {
        System.out.println("Orange color is: " + str);
    }
}

3.AppleAdapter

package com.test.adaptermodel;

public class AppleAdapter extends Apple {
    private Orange orange;

    public AppleAdapter(Orange orange) {
        this.orange = orange;
    }

    public void getAColor(String str) {
        orange.getOColor(str);
    }
}

4.Test

package com.test.adaptermodel;

public class Test {
    public static void main(String[] args) {
        Apple apple = new Apple();
        apple.getAColor("green");

        Orange orange = new Orange();
        //要让一个桔子被“适配”成一个苹果
        AppleAdapter aa = new AppleAdapter(orange);
        //于是桔子表现得就像苹果一样了
        aa.getAColor("red");
    }
}

5.结果

Apple color is: green
Orange color is: red

==============================
例子二:(类适配器模式和对象适配器模式对比)
1。基本接口标准

package com.test.adaptermodel;

public interface Socket {
    // 目标接口,或称为标准接口
    // 基本插座的功能
    public void myPlug();
}

2。香港插口实现

package com.test.adaptermodel;

/**
 * 站在香港的角度
 * 
 * @author Administrator
 *
 */
public class HongKongSocket implements Socket {

    @Override
    public void myPlug() {
        // TODO Auto-generated method stub
        System.out.println("香港自己普通的英式方头插座 具有插在香港插排上的功能...");
    }

}

3。内地插口只有自己的方式,没有香港插口的标准

package com.test.adaptermodel;

/**
 * 已存在的、具有特殊功能、但不符合我们既有的标准接口的类   不能直接插在香港插排的插在
 * @author Administrator
 *
 */
public class InlandSocket {
    public void myPlugNoWorkInHongkong() {
        System.out.println("来自内地的需要适配器的内地扁头插座...");
    }
}

4。SocketAdapter //类适配器模式

package com.test.adaptermodel;

public class SocketAdapter extends InlandSocket implements Socket{

    @Override
    public void myPlug() {
        // TODO Auto-generated method stub
        super.myPlugNoWorkInHongkong(); 
    }

}

5。SocketAdapterTwo //对象适配器模式

package com.test.adaptermodel;

public class SocketAdapterTwo implements Socket{

    private InlandSocket inlandSocket;


    public SocketAdapterTwo(InlandSocket inlandSocket) {
        super();
        this.inlandSocket = inlandSocket;
    }


    @Override
    public void myPlug() {
        // TODO Auto-generated method stub
        inlandSocket.myPlugNoWorkInHongkong();
    }

}

6。Test

package com.test.adaptermodel;
//都是站在香港的角度考虑
public class SocketTest {
    public static void main(String[] args) {
        objectAdapter();
        classAdapter();
    }

    private static void objectAdapter() {
        // TODO Auto-generated method stub
        // 使用普通功能类 普通插头
        HongKongSocket hongKongSocket = new HongKongSocket();
        hongKongSocket.myPlug();

        // 使用特殊功能类,即适配类,  转换器
        // 需要先创建一个被适配类的对象作为参数
        SocketAdapterTwo adapter = new SocketAdapterTwo(new InlandSocket());
        adapter.myPlug();
    }

    /**
     * 类的适配器模式
     */
    private static void classAdapter() {
        // 使用普通插头
        HongKongSocket hongKongSocket = new HongKongSocket();
        hongKongSocket.myPlug();

        // 使用转换器
        SocketAdapter adapter = new SocketAdapter();
        adapter.myPlug();
    }
}

7,结果(两个模式结果是一致的)

香港自己普通的英式方头插座 具有插在香港插排上的功能...
来自内地的需要适配器的内地扁头插座...
香港自己普通的英式方头插座 具有插在香港插排上的功能...
来自内地的需要适配器的内地扁头插座...

1.继承(局限:java单继承)

采用继承方式的称为类适配器

特点:通过多继承不兼容接口,实现对目标接口的匹配,单一的对某个类而实现的适配

2.组合

采用组合方式的适配器称为对象适配器

特点:把”被适配者”作为对象组合到适配器中,以修改目标接口包装被适配者

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值