アダプターパターンは構造パターンです
概要
構造パターンは、既存のクラスまたはオブジェクトをまとめて編成して、より強力な構造を形成する方法に焦点を当てています。
日常生活では、このような問題に遭遇することがよくあります。薄くて軽いノートブックには、通常、type-c または usb-a インターフェイスしかなく、ネットワーク ポートがありません。ただし、日常的な使用では、インターネットにアクセスするためにネットワーク ポートに接続する必要があることが多く、最初に思い浮かぶ解決策は、アダプターまたはドッキングステーションを購入することです。type-c または usb-a を他のタイプのインターフェイスに変換して使用できるようにすることができます。実際、これはアダプターモードです。
一般的に使用される充電ヘッドが電源アダプターと呼ばれるのはなぜですか? 従来の電源はAC220Vですが、携帯電話の充電には5Vしか必要ない場合があるため、電力は供給されていますが、直接充電することはできません。電力会社にDC5Vの電源を提供してもらうことも不可能なので、この時に登場するのが電源アダプターです。たとえば、Apple の先祖代々の 5V1A 充電ヘッドは、実際には 220V AC 電力を 5V DC 電力に変換して送信します。これはAC220Vと携帯電話の間のアダプタの役割を果たすことに相当します。
アダプタパターンはクラスアダプタとオブジェクトアダプタに分かれます。
コード
以下は、インターネットにアクセスするためにネットワーク ケーブルに接続するアダプターが必要なコンピューターの例です。
クラスアダプター
1. コンピュータを定義する
/**
* 电脑
* <p>想上网,需要插网线
*/
public class Computer {
/**
* 电脑需要连接上转换器才可以上网
*
* @param adapter 转接器
*/
public void connect(NetToUsb adapter) {
// 上网的具体实现,找一个转接头
adapter.connectNetLine();
}
}
2. ネットワークケーブルを定義する
/**
* 网线
*/
public class NetLine {
/**
* 上网
*/
public void online(){
System.out.println("连接网线上网");
}
}
3. USB からネットワーク ポート アダプタへの定義
/**
* 转接器
*/
public interface NetToUsb {
/**
* 处理请求,usb -> 网线
*/
void connectNetLine();
}
4. クラスアダプターを定義する
/**
* 类适配器
*/
public class ClassAdapter extends NetLine implements NetToUsb {
@Override
public void connectNetLine() {
// 可以上网了
super.online();
}
}
5. アダプターを使用してネットワーク ケーブルに接続し、インターネットにアクセスします。
// 电脑
Computer computer = new Computer();
// 转接器已经插上网线
ClassAdapter adapter = new ClassAdapter();
// 电脑连接转接器,成功上网
computer.connect(adapter);
この実装では、継承ビットを占有する必要があります。この時点で NetToUsb がインターフェイスではなく抽象クラスである場合、Java は多重継承をサポートしていないため、実装できません。同時に、合成と再利用の原則に従って、機能は合成を通じてより多く実装されるべきです。
それでは、2 番目の、より一般的に使用されるパターンであるobjectadapterを見てみましょう。
オブジェクトアダプター
4. オブジェクトアダプターを定義する
/**
* 对象适配器
*/
public class ObjectAdapter implements NetToUsb {
/**
* 网线
*/
private NetLine netLine;
public ObjectAdapter(NetLine netLine) {
this.netLine = netLine;
}
@Override
public void connectNetLine() {
// 可以上网了
netLine.online();
}
}
5. アダプターを使用してネットワーク ケーブルに接続し、インターネットにアクセスします。
/**
* 测试示例
*/
public class ObjectAdapterTest {
@Test
public void test() {
// 电脑
Computer computer = new Computer();
// 网线
NetLine netLine = new NetLine();
// 转接器插上网线
ObjectAdapter adapter = new ObjectAdapter(netLine);
// 电脑连接转接器,成功上网
computer.connect(adapter);
}
}
この方法は継承ビットを占有せず、合成と再利用の原則を満たし、結合が低く、より柔軟であるため、推奨されます。
長所と短所
アドバンテージ
1. 無関係な 2 つのクラスを一緒に実行できます。
2. クラスの再利用が改善されました。
3. クラスの透明性が向上しました。
4. 優れた柔軟性。
欠点がある
1. アダプターを過度に使用すると、システムが非常に乱雑になり、全体を把握することが困難になります。たとえば、インターフェイス A が呼び出されていることは明らかですが、実際にはインターフェイス B を実装するために内部的に調整されています。これがシステム内で頻繁に発生すると、それは災害に相当します。したがって、必要がなければアダプタを使用せずに直接システムを再構築することも可能です。
2. Java は最大 1 つのクラスを継承するため、最大 1 つのクラスにのみ適応でき、ターゲット クラスは抽象クラスでなければなりません。
使用するシーン
機能しているシステムのインターフェイスを変更したい場合は、アダプター パターンの使用を検討してください。
予防
アダプターは詳細設計中に追加されるのではなく、実際のプロジェクトの問題を解決するために追加されます。
参考
https://www.bilibili.com/video/BV1mc411h719?p=7&vd_source=299f4bc123b19e7d6f66fefd8f124a03