其他设计模式
java单例模式
java建造者模式
java策略模式
java代理模式
java观察者模式
java适配器模式
java外观模式
适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器模式有两种:类的适配器模式和对象的适配器模式
1.对象适配器
对象适配器结构图.pngTarget(这是客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口)代码如下:
public interface Target {
public void request();
}
Adaptee(需要适配的类)代码如下:
public class Adaptee {
public void specificRequest(){
}
}
Adapter(通过在内部包装一个Adaptee对象,把源对象接口转换成目标接口)代码如下:
public class Adapter implements Target{
private Adaptee adaptee=new Adaptee();
@Override
public void request() {
adaptee.specificRequest();
}
}
客户端代码如下:
public class TestAdapter {
public static void main(String[] args) {
Target target = new Adapter();
target.request();
}
}
2.类适配器
与对象适配器模式不同的是,类适配器模式是使用继承关系连接到Adaptee类,而不是使用委派关系连接到Adaptee类。
只需改变对象适配器的Adapter代码, Target和Adaptee保持一致,Adapter代码如下:
public class Adapter extends Adaptee implements Target{
@Override
public void request() {
this.specificRequest();
}
}
3.实例讲解
火箭队比赛,教练暂停时给中国球员Zhou分配进攻和防守任务。但是Zhou刚去NBA,没学过英语,听不懂教练分配的任务,所以这时候需要翻译,此时翻译就相当于适配器。
NBA球员抽象类,都有进攻(attack)和防守(defense)的方法。
public interface Player {
public void attack();
public void defense();
}
Zhou类(Adaptee),听不懂attack和defense,只知道进攻和防守
public class Zhou {
public void 进攻() {
System.out.print("进攻");
}
public void 防守() {
System.out.print("防守");
}
}
翻译类(Adapter)此处采用对象适配器
public class Translator implements Player{
private Zhou zhou=new Zhou();
@Override
public void attack() {
zhou.进攻();
}
@Override
public void defense() {
zhou.防守();
}
}
客户端调用:打印出攻击防守
public class TestAdapter {
public static void main(String[] args) {
Player player=new Translator();
player.attack();
player.defense();
}
}
如果上述要改成类适配器,只需改变Translator类
public class Translator extends Zhou implements Player{
@Override
public void attack() {
this.进攻();
}
@Override
public void defense() {
this.防守();
}
}
优点:
- 更好的复用性
- 更好的扩展性
缺点:
- 过多的使用适配器,会让系统非常零乱,不容易整体进行把握。
何时选用适配器模式:
- 如果你想要使用一个已经存在的类,但是它的接口不符合你的需求,这种情况可以使用适配器模式,来把已有的实现转换成你需要的接口。
- 如果你想创建一个可以复用的类,这个类可能和一些不兼容的类一起工作,这种情况可以使用适配器模式,到时候需要什么就适配什么。
- 如果你想使用一些已经存在的子类,但是不可能对每一个子类都进行适配,这种情况可以选用对象适配器,直接适配这些子类的父类就可以了。
网友评论