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

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

所有代码请访问:[email protected]: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

你可能感兴趣的:(设计模式)