您的位置:首页 > 其它

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

2018-01-11 20:06 375 查看
核心模块: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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息