设计模式适配器模式(AdapterPattern)

核心模块:Target目标类、Adaptee被适配者、Adapter适配器

所有代码请访问:git@code.aliyun.com:289804201/PatternLearn.git

使用场景:将目标类和适配者类解耦,一般用于接入第三方库;
优点:增加了类的透明性,新加adaptee只需要新加Adapter;
缺点:不支持多重继承,一个Adapter只能适配一个adaptee不能适配多个;
注意:
1,适配器模式分为类适配器和对象适配器,类适配器是继承,只能适配一类,对象适配器是把Adaptee当作参数传入Adater;

2,适配器模式和代理者模式的区别:客户访问不了被代理者,而适配者可以问,只是为了统一接口,方便用户;被代理的对象需要内部创建,而被适配者需要外部传入;

/**
 * Created by tory on 2018/1/11.
 * 类适配器实用范围窄,我们这里只做对象适配器;
 * 对象适配器,就是将要适配的对象传入到适配器中;
 */
public class AdapterPattern {
    public static void main(String[] args) {
        //ta 为当前系统
        Target ta;
        FrescoAdapter fa = new FrescoAdapter(new Fresco());
        GlideAdapter ga = new GlideAdapter(new Glide());
        PicassoAdapter pa = new PicassoAdapter(new Picsso());
        ta = fa;
        ta.loadCircle("http://www.baidu.com", 2);
        ta.load("www.xxx.com/xxx.png");
        ta.loadinto("www.xxx.com/xx.jpg", "textview");
        //系统切换为Glide
        ta = ga;
        ta.loadCircle("http://www.baidu.com", 2);
        ta.load("www.xxx.com/xxx.png");
        ta.loadinto("www.xxx.com/xx.jpg", "textview");
    }
}

//这里我们简单做一个图片的加载适配,市场上有Fresco,glide,picasso等,提供的图片加载方法各不一样;这里统一适配
//Target 目标类
interface Target {
    void load(String url);

    void loadCircle(String url, int radis);

    void loadinto(String url, String UItarget);
}

//Adaptee 被适配者
class Fresco {
    //Fresco图片加载系统
    void loadPicAsync(String url) {
        System.out.println("Fresco 同步加载图片...");
    }

    void loadinto(String url, String target) {
        System.out.println("Fresco 加载图片...到" + target);
    }
}

//Adaptee 被适配者
class Glide {
    //Fresco图片加载系统
    void loadPic(String url) {
        System.out.println("Glide 加载图片...");
    }

    void loadinto(String url, String target) {
        System.out.println("Glide 加载图片...到" + target);
    }
}

//Adaptee 被适配者
class Picsso {
    //Fresco图片加载系统
    void load(String url) {
        System.out.println("Picsso 加载图片..." + url);
    }

    void loadCircle(String url, int rdias) {
        System.out.println("Picsso 加载图片圆圈..." + rdias);
    }
}


//Adapter 适配器
class FrescoAdapter implements Target {
    Fresco fresco;

    FrescoAdapter(Fresco fresco) {
        this.fresco = fresco;
    }

    @Override
    public void load(String url) {
        fresco.loadPicAsync(url);
    }

    @Override
    public void loadCircle(String url, int radis) {
        System.out.println("Fresco 不支持圆圈图片");
    }

    @Override
    public void loadinto(String url, String UItarget) {
        fresco.loadinto(url, UItarget);
    }
}

//Adapter 适配器
class GlideAdapter implements Target {
    Glide glide;

    GlideAdapter(Glide glide) {
        this.glide = glide;
    }

    @Override
    public void load(String url) {
        glide.loadPic(url);
    }

    @Override
    public void loadCircle(String url, int radis) {
        System.out.println("Glide 不支持圆圈图片");
    }

    @Override
    public void loadinto(String url, String UItarget) {
        glide.loadinto(url, UItarget);
    }
}

//Adapter 适配器
class PicassoAdapter implements Target {
    Picsso picsso;

    PicassoAdapter(Picsso picsso) {
        this.picsso = picsso;
    }

    @Override
    public void load(String url) {
        picsso.load(url);
    }

    @Override
    public void loadCircle(String url, int radis) {
        picsso.loadCircle(url, radis);
    }

    @Override
    public void loadinto(String url, String UItarget) {
        System.out.println("Picasso 不支持loadinto");
    }
}

内容打印
Hello World!
Fresco 不支持圆圈图片
Fresco 同步加载图片...
Fresco 加载图片...到textview
Glide 不支持圆圈图片
Glide 加载图片...
Glide 加载图片...到textview

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
适配器模式Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口。它通常用于解决两个已有接口之间不兼容的问题。 在给出的代码示例中,我们可以看到适配器模式的应用。在Main.cpp文件中,创建了一个Target对象指针target,并将其初始化为Adapter对象。然后调用target的request()函数,实际上调用的是Adapter的request()函数。而Adapter的request()函数内部调用了Adaptee的specificRequest()函数,完成了适配的过程。 在Head.h文件中定义了三个类:Target、Adaptee和Adapter。Target类是适配器模式中的目标接口,定义了一个虚函数request()。Adaptee类是被适配的类,它有一个特殊的请求函数specificRequest()。Adapter类是适配器类,它继承了Target类,并在其request()函数中调用了Adaptee类的specificRequest()函数。 通过适配器模式,我们可以将不兼容的两个接口进行适配,使它们能够协同工作。这在软件开发中经常用于复用已有代码或集成多个系统。 参考: C++设计模式适配器模式Adapter Head.cpp Main.cpp<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C++设计模式适配器模式(Adapter)](https://download.csdn.net/download/weixin_38666785/12761879)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [C++设计模式-适配器模式](https://blog.csdn.net/qq78442761/article/details/95766831)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值