适配器模式(Adater Pattern)
适配器模式又叫变压模式,也叫做包装模式,但包装模式不止一个,装饰者模式也是包装者模式的一种:将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
实现的核心思想:通过类的继承或者关联。
因此可以分成两类:
1. 类适配器:通过类间的继承实现。
2. 对象适配器:通过类间的关联实现。
优点:
1. 使两个没有任何关系的类在一起运行。
2. 增加类的透明性,高层模块只需要调用Target目标角色,对于具体的业务实现不需要关心,交给源角色Adapee处理。对高层模块来说是透明的。
3. 提高类的复用度,源角色在原有系统中可以正常使用,在目标系统中又可以充当新的演员。
4. 灵活性好,加载和卸载简单。对于其它代码基本不需要修改。
使用场景:在一个已投产的项目中,需要使用一个已有的类或者新建的类,而这个类又不适合系统原有的接口,可以考虑使用适配者模式。
使用的注意事项:在详细设计中一般不会考虑使用适配者模式,而是在对系统的扩展上,同时要保证遵守依赖倒置和里氏替换原则。
代码:
类适配器:
package org.AdaterPattern.extend;
public interface Target {
public void request();
}
package org.AdaterPattern.extend;
public class ConcreteTarget implements Target {
public void request() {
System.out.println("this is ConcreteTarget");
}
}
package org.AdaterPattern.extend;
public class Adapee {
public void dosoming(){
System.out.println("this is Adapee");
}
}
package org.AdaterPattern.extend;
public class Adater extends Adapee implements Target {
public void request() {
super.dosoming();
}
}
package org.AdaterPattern.extend;
public class Client {
public static void main(String[] args) {
Target target = new ConcreteTarget();
target.request();
System.out.println("----------------");
// 高层模块通过适配器使用源角色Adapee的类
target = new Adater();
target.request();
}
}
对象适配器:
前面的Target,ConcreteTarget一样在此不重复。
package org.AdaterPattern.relation;
public interface IAdapee1 {
public abstract void dosoming();
}
package org.AdaterPattern.relation;
public interface IAdapee2 {
public void dosoming();
}
package org.AdaterPattern.relation;
public class Adapee1 implements IAdapee1 {
public void dosoming(){
System.out.println("this is Adapee1");
}
}
package org.AdaterPattern.relation;
public class Adapee2 implements IAdapee2{
public void dosoming(){
System.out.println("this is Adapee2");
}
}
package org.AdaterPattern.relation;
public class Adater implements Target {
private IAdapee1 iAdapee1;
private IAdapee2 iAdapee2;
private Adapee1 adapee1;
private Adapee2 adapee2;
public Adater(Adapee1 adapee1, Adapee2 adapee2) {
this.adapee1 = adapee1;
this.adapee2 = adapee2;
this.iAdapee1 = this.adapee1;
this.iAdapee2 = this.adapee2;
}
public void request() {
this.iAdapee1.dosoming();
this.iAdapee2.dosoming();
}
}
package org.AdaterPattern.relation;
public class Client {
public static void main(String[] args) {
Target target = new ConcreteTarget();
target.request();
System.out.println("----------------");
// 高层模块通过适配器使用源角色Adapee的类
target = new Adater(new Adapee1(),new Adapee2());
target.request();
}
}

- 大小: 23.3 KB

- 大小: 23.6 KB
分享到:
相关推荐
1. **创建适配器(Adater)**:一个Adapter是连接数据源和RecyclerView的桥梁,它负责将数据转化为可显示的视图。在创建自定义Adapter时,我们需要继承`RecyclerView.Adapter`,并实现其基本方法: - ` ...
ViewPager类需要一个PagerAdapter适配器类给它提供数据(这点跟ListView一样需要数据适配器Adater) ViewPager经常和Fragment一起使用,并且官方还提供了专门的FragmentPagerAdapter和FragmentStatePagerAd
当要显示的数据过多时,为了更好的提升用户感知,在很多APP中都会使用分页...5.获得第二页以后的数据后,adater增加数据并刷新notifyDateSetChanged();(需要用到Handler) 现在我们就通过线程休眠的的方式模拟ListV
该文档详细的介绍了怎样设置一个虚拟网卡~让电脑发出wifi~windows版本win7以上
概念验证:生物化学-蛋白质渲染 例子 使用默认或其他在此处查看实际使用的原型。 这只是一个概念证明,因此并非所有UniProt入选都可以使用,我们还没有检查可能的例外情况。 我们已经测试了一些。...
如果你的canal在windows启动报错。只需要将我的startup.bat替换一下。不过替换前记得更新哈。 - JVM6
接着,我们关注Adater的陷阱。常见的问题包括: 1. 数据同步问题:当Adapter的数据源发生变化时,应调用`notifyDataSetChanged()`通知ListView刷新。否则,更新的数据可能无法立即显示。 2. 视图复用不当:如上所...
系统在建立虚拟局域网或虚拟专用网络时,会虚拟出一个网卡,这个网卡并不实际存在于你的计算机中。
使用方式和RecyclerView完全一致,不需要额外的layout,不需要写特殊的adater。 加载效果内置了AVLoadingIndicatorView上的所有效果,可以根据需要指定。 项目地址:https://github.com/jianghejie/XRecyclerView ...
使用方式和RecyclerView完全一致,不需要额外的layout,不需要写特殊的adater。 加载效果内置了AVLoadingIndicatorView上的所有效果,可以根据需要指定。项目地址:https://github.com/jianghejie/XRecyclerView ...