适配器模式是最常用的设计模式之一。我们随处可以见到他的身影。例如Android中的某些监听器接口,还有著名的ListAdapter。
适配器模式,实际上是一个接口转换模式。也就是我们要把一个接口转换为另外一个接口。也许你要问,为什么要这么做呢? 当然,我们也可以不必这么做,直接实现所需要的接口,不就成了吗? 对于一些教学上的例子来看,确实是这样,但是,如果要转换的接口很复杂,而且,我们很可能只是需要另外一个接口的某些实现,就可以完成新接口的大部分功能,这样的 话,使用了Adapter模式,对于客户端来说,即使Adapter内的实现发生了变化,也并不影响他的继续使用。
简而言之,使用适配器的场景就是: 新接口使用老的实现来过度。做法有两种,
第一: 实现新接口(不是真正的实现,只是看起来像),集成老的实现类。
第二: 实现新接口(该有的方法必须有,内容可空),包含老接口。
这两种类图分别如下:
这两种方法都可以实现Adapter,我更喜欢第二种。优先组合。继承不仅占用了唯一继承权,而且还继承了很多不必要的东西。
下面我们以代码来看看。这个代码使用插座的故事来说明适配器。
首先,很久以前我们的插座是2口的,标准如此。
public interface PowerSocket {
public static final int FL = 0;
public static final int ZL = 1;
public int getFrontLine();
public int getZeroLine();
}
为了说明问题,方法只是实例而已。我们的插座有两根线,火线零线
然后我们根据这个标准生产了一种插座。GN插座。
public class GNPowerSocket implements PowerSocket{
@Override
public int getFrontLine() {
// TODO Auto-generated method stub
return PowerSocket.FL;
}
@Override
public int getZeroLine() {
// TODO Auto-generated method stub
return PowerSocket.ZL;
}
}
很好。一切都很顺利。突然,着火了。。。。为了更安全,我们决定加入一个接地的线吧。
于是新的标准出来了。地线是必须的。
public interface NewPowerSocket {
public static final int GL = 3;
public int getFrontLine();
public int getZeroLine();
public int getGroundLine();
}
然后又有了三个口的插座。很多电器都变成三口了。可是,我觉得再去买三口插座,太贵了。或者某一天我突然到了个陌生的环境中,发现只有两口的插座怎么办?
为了解决这个问题。我只好买了个转换器。两口转三口。
public class SocketAdapter implements NewPowerSocket{
private PowerSocket GNps;
public SocketAdapter(PowerSocket ps){
this.GNps = ps;
}
@Override
public int getGroundLine() {
// TODO Auto-generated method stub
return NewPowerSocket.GL;
}
@Override
public int getFrontLine() {
// TODO Auto-generated method stub
return GNps.getFrontLine();
}
@Override
public int getZeroLine() {
// TODO Auto-generated method stub
return GNps.getZeroLine();
}
}
这里有个小问题,其实这个例子不太合适。稍后再说。
好了,我们看看使用过程。
public class Client {
public void useSocket(NewPowerSocket nps){
nps.getFrontLine();
//dosomething...
//...
}
public static void main(String[] args){
Client client = new Client();
PowerSocket ps = new GNPowerSocket();
SocketAdapter adapter = new SocketAdapter(ps);
client.useSocket(adapter);
}
}
好了,来说说这个例子的问题,其实这个例子中的两个接口,都很小,实现起来超级方便。完全可以直接实现吧。好比这个插座,大家都买三口的吧,花不了几个钱。。。
而且,我们这里的适配器,完全就是一个三口插座。哈哈。
还有,这里使用的委托的方式实现的。
实际情况中,适配器并不一定完全实现接口方法(必须写出方法,内容可以为空),而且复杂的可重用的实现使用老的接口类。所以上面的代码,仅仅是一个了解。
- 大小: 46.2 KB
- 大小: 51.4 KB
分享到:
相关推荐
设计模式之 适配器 Adapter C++ 源码 vs2019 工具,设计模式之 适配器 Adapter C++ 源码 vs2019 工具,设计模式之 适配器 Adapter C++ 源码 vs2019 工具,设计模式之 适配器 Adapter C++ 源码 vs2019 工具,设计模式...
适配器模式 设计模式 Adapter 还请各位大S指教
c++设计模式-结构型模式-适配器模式,其他工程,c++源码。适配器模式(Adapter)的定义如下:将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类能一起工作。
适配器模式(Adapter Pattern) 是作为两个不兼容接口之间的桥梁, 这种类型的设计模式属于结构型模式。 一些书籍也称适配器模式为缺省适配器模式(Default Adapter Pattern) 。 适配器模式主要分 为三类: 类...
设计模式之适配器模式(Adapter Pattern) 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
设计模式C++学习之适配器模式(Adapter)
java中的适配器模式,Adapter设计模式(包装器)23种设计模式之一
C#设计模式之适配器模式应用实例
java设计模式之适配器模式,希望对大家有所帮助。
介绍24设计模式中的Adapter模式,如果使用,实例讲解,等等
走进设计模式之——适配器模式 (Adapter) 对应代码
在这里与各位分享本人从网络上下载的C#面向对象设计模式纵横谈系列视频,共有25节,除了第一节需要各位贡献一点资源分以作为对本人上传资源的回馈,后面的其他资源均不需要资源分。敬请期待。 这是第7节:结构型...
NULL 博文链接:https://lizhao6210-126-com.iteye.com/blog/1753041
适配器模式是一种结构型设计模式,它允许接口不兼容的两个类可以协同工作。以下是该模式的要点: 1. **角色**: - **Target(目标接口)**:客户端期望调用的接口。 - **Adaptee(适配者)**:现有的、接口与目标...
1.1 什么是设计模式 2 1.2 Smalltalk MVC 中的设计模式 3 1.3 描述设计模式 4 1.4 设计模式的编目 5 1.5 组织编目 7 1.6 设计模式怎样解决设计问题 8 1.6.1 寻找合适的对象 8 1.6.2 决定对象的粒度 9 1.6.3 指定对象...
Head First 设计模式 (七) 适配器模式(Adapter pattern) C++实现
- 23种设计模式 - 工厂方法模式(Factory Method) - 抽象工厂模式(Abstract Factory) - 单例模式(Singleton) - 建造者模式(Builder) - 原型模式(Prototype) - 代理模式(Proxy) - 适配器模式(Adapter) - 装饰...
C#面向对象设计模式纵横谈(7):Adapter 适配器模式(结构型模式) 体验课程
javascript设计模式之Adapter模式【适配器模式】实现方法示例.docx