Design patterns 对象适配器模式和类适配器模式之间的差异
如何决定何时使用对象适配器以及何时使用类适配器 问题陈述: 创建社交网站,并提供facebook、google plus和orkut的导入功能。我无法决定是使用对象适配器还是类适配器 我已经看过了,但无法理解差异的本质。对象适配器:Design patterns 对象适配器模式和类适配器模式之间的差异,design-patterns,adapter,Design Patterns,Adapter,如何决定何时使用对象适配器以及何时使用类适配器 问题陈述: 创建社交网站,并提供facebook、google plus和orkut的导入功能。我无法决定是使用对象适配器还是类适配器 我已经看过了,但无法理解差异的本质。对象适配器: $Adapter = new MyEngine(new MyAdapter($options)); $Adapter->write('something'); 类适配器 MyAdapter extends BaseAdapter implements Ada
$Adapter = new MyEngine(new MyAdapter($options));
$Adapter->write('something');
类适配器
MyAdapter extends BaseAdapter implements AdapterInterface { ... }
$Adapter = new MyAdapter($options);
$Adapter->write('something');
主要区别是:
- 类适配器使用继承,只能包装类。它不能包装接口,因为根据定义它必须派生自某个基类
- 对象适配器使用组合,可以包装类或接口,或包装两者。它可以做到这一点,因为它包含作为私有封装成员的类或接口对象实例
类适配器使用多重继承使一个接口适应另一个接口:(取决于您的编程语言:Java&C不支持多重继承) 对象适配器取决于对象组成: 图片来源:设计模式(可重用面向对象软件的元素)一书, 类适配器使用子类化,而对象适配器通过组合使用委托
abstract class AbstractClientClass {
abstract void display();
}
class MyNewObjectAdapter extends AbstractClientClass {
MyExistingServiceClass existingClassObject;
void display() {
existingClassObject.show();
}
}
例如:
class MyExistingServiceClass {
public void show() {
System.out.println("Inside Service method show()");
}
}
interface ClientInterface {
void display();
}
class MyNewClassAdapter extends MyExistingServiceClass implements ClientInterface {
void display() {
show();
}
}
上面是类适配器的一个示例。通过从display()的内部实现调用现有的show()方法,我们将MyExistingServiceClass改编为ClientInterface
要将此转换为对象适配器,代码如下:
class MyNewObjectAdapter implements ClientInterface {
MyExistingServiceClass existingClassObject;
void display() {
existingClassObject.show();
}
}
现在,当使用对象适配器代替类Adatper时
abstract class AbstractClientClass {
abstract void display();
}
class MyNewObjectAdapter extends AbstractClientClass {
MyExistingServiceClass existingClassObject;
void display() {
existingClassObject.show();
}
}
class MyTableModel extends AbstractTableModel {
MyDomainObject[] existingDomainObjects[];
public int getColumnCount() {
return 4;
}
public int getRowCount() {
return existingDomainObjects.length();
}
public MyDomainObject getValueAt(int i) {
return existingDomainObjects[i];
}
}
class MyTableModel extends AbstractTableModel {
MyDomainObject[] existingDomainObjects[];
public int getColumnCount() {
return 4;
}
public int getRowCount() {
return existingDomainObjects.length();
}
public MyDomainObject getValueAt(int i) {
return existingDomainObjects[i];
}
}
适配器设计模式是一种结构设计模式,它的使用使两个不相关的接口可以一起工作。连接这些不相关接口的对象称为适配器。
-双向适配器模式
在实现适配器模式时,有两种方法–类适配器和对象适配器–但是这两种方法产生相同的结果
类适配器–此表单使用java继承并扩展源接口,在我们的示例中是Socket类。
对象适配器–此表单使用Java组合,适配器包含源对象