适配器模式
What
首先了解一下设计模式的开闭原则(Open/Closed Principle)
In object-oriented programming, the open/closed principle states “software entities (classes, modules, functions, etc.) should be open for extension, but closed for modification”; that is,
such an entity can allow its behaviour to be extended without modifying its source code
.
也就是说,一个实体在不用更改它的源代码情况下,允许拓展它的行为
。
适配器模式(Apapter Pattern):在不用更改适配者
类代码前提下,通过适配器
类拓展其功能。
- 目标(Target):目标可以是抽象类或具体类或接口,客户期待接口的样子;
- 适配者(Adaptee):适配者类一般是一个已有具体类或接口,但与目标接口不匹配兼容;
- 适配器(Adapter):将已有接口转换成目标接口;
适配器模式分三类:
- 类适配器模式(class adapter pattern):适配者与适配器是继承关系;
- 对象适配器模式(object adapter pattern):适配者与适配器是关联关系;
- 缺省适配器模式(default adapter pattern):
当不需要全部实现接口提供的方法时,可以设计一个适配器抽象类实现接口,并为接口中的每个方法提供默认方法,抽象类的子类就可以有选择的覆盖父类的某些方法实现需求,它适用于一个接口不想使用所有的方法的情况。在java8后,接口中可以有default方法,就不需要这种缺省适配器模式了。接口中方法都设置为default,实现为空,这样同样同样可以达到缺省适配器模式同样的效果。
How
示例:类适配器模式(class adapter pattern)
//测试类
public class Test {
public static void main(String []args) {
Target adapter = new Adapter();
adapter.sayHello("song");
}
}
//适配者
class Adaptee{
public void method(){
System.out.println("hello world");
}
}
//目标
interface Target{
void sayHello(String name);
}
//适配器类
class Adapter extends Adaptee implements Target{
@Override
public void sayHello(String name) {
System.out.print("Hello " + name + ",");
super.method();
}
}
示例:对象适配器模式(object adapter pattern)
//测试类
public class Test {
public static void main(String []args) {
Target adapter = new Adapter();
adapter.sayHello("song");
}
}
//适配者
class Adaptee{
public void method(){
System.out.println("hello world");
}
}
//目标
interface Target{
void sayHello(String name);
}
//适配器类
class Adapter implements Target{
Adaptee adaptee = new Adaptee();
@Override
public void sayHello(String name) {
System.out.print("Hello " + name + ",");
adaptee.method();
}
}
示例:缺省适配器模式(default adapter pattern)
//测试类
public class Test {
public static void main(String []args) {
//不用缺省适配器类
Target operator1 = new Operator(new Target(){
@Override
public void method1(){}
@Override
public void method2(){
System.out.println("method2");
}
@Override
public void method3(){}
});
operator1.method2();
//使用缺省适配器类
Target operator2 = new Operator(new DefaultAdapter(){
@Override
public void method2(){
System.out.println("method2");
}
});
operator2.method2();
}
}
//目标
interface Target{
void method1();
void method2();
void method3();
}
//缺省适配器类
abstract class DefaultAdapter implements Target{
@Override
public void method1(){}
@Override
public void method2(){}
@Override
public void method3(){}
}
class Operator implements Target{
Target target;
public Operator(Target target){
this.target = target;
}
@Override
public void method1(){
target.method1();
}
@Override
public void method2(){
target.method2();
}
@Override
public void method3(){
target.method3();
}
}
When & Where
系统需要使用已经存在的类,功能符合系统要求,但这个类的接口不符合系统的需求,通过适配器模式解决不兼容的问题,使这些功能类得到复用。
参考链接 设计模式 | 适配器模式及典型应用
结束语:优秀是一种习惯。