コード 1 アダプター パターン (継承)
package com.fly.patterns.adapter.jicheng;
/**
* @author fei.chen
* @projectName design-patterns
* @description: Banner
* @date 2023/5/30下午 4:21
*/
public class Banner {
private String string;
public Banner(String string){
this.string = string;
}
public void showWithParen(){
System.out.println("("+ string +")");
}
public void showWithAster(){
System.out.println("*"+ string +"*");
}
}
package com.fly.patterns.adapter.jicheng;
/**
* @author fei.chen
* @projectName design-patterns
* @description: 接口类
* @date 2023/5/30下午 4:23
*/
public interface Print {
public abstract void printWeak();
public abstract void printStrong();
}
package com.fly.patterns.adapter.jicheng;
/**
* @author fei.chen
* @projectName design-patterns
* @description: 发挥适配器功能,它先扩充既有的Banner类,然后继承showWithParen与showWithAster方法。
* 另外还要实现需要的Print接口,再实现printWeak与printStrong方法;这样PrintBannert就发挥了适配器功能。
* @date 2023/5/30下午 4:24
*/
public class PrintBannert extends Banner implements Print{
public PrintBannert(String string) {
super(string);
}
@Override
public void printWeak() {
this.showWithParen();
}
@Override
public void printStrong() {
this.showWithAster();
}
public void myMethod() {
System.out.println("啦啦啦");
}
}
コード 2 アダプター パターン (委任)
package com.fly.patterns.adapter.weituo;
/**
* @author fei.chen
* @projectName design-patterns
* @date 2023/5/30下午 4:40
*/
public abstract class Print {
public abstract void printWeak();
public abstract void printStrong();
}
package com.fly.patterns.adapter.weituo;
import com.fly.patterns.adapter.jicheng.Banner;
/**
* @author fei.chen
* @projectName design-patterns
* @date 2023/5/30下午 4:41
*/
public class PrintBannert extends Print{
private Banner banner;
public PrintBannert(String string){
this.banner = new Banner(string);
}
@Override
public void printWeak() {
banner.showWithParen();
}
@Override
public void printStrong() {
banner.showWithAster();
}
}
テストクラス
package com.fly.patterns.adapter;
import com.fly.patterns.adapter.jicheng.Print;
import com.fly.patterns.adapter.jicheng.PrintBannert;
/**
* @author fei.chen
* @projectName design-patterns
* @description: 测试类- 仅把字符串输出成 (Hello ) 或 *Hello *
* @date 2023/5/30下午 4:27
*/
public class Main {
public static void main(String[] args) {
// 下面代码就可以看出有 Banner 类存在和它的内部方法,直接通过适配调用Banner类了。
// 这种就是继承方式
Print p = new PrintBannert("Hello");
p.printWeak();
p.printStrong();
com.fly.patterns.adapter.weituo.PrintBannert hello = new com.fly.patterns.adapter.weituo.PrintBannert("Hello");
hello.printWeak();
hello.printStrong();
// 针对上面两种方法 其实第二个感觉很方便,那为什么还要使用第一个方式呢?
// 其实是因为想强调 只使用 Print 接口的方法。在使用中 PrintBannert 类跟 Print 接口的方法虽然相同,但是在开发中不一定,
// PrintBannert类在实际中可能实现了很多的其他的一些方法,所以我先将其指定到 Print 类型变量后在使用,我只利用并且只使用Print接口的方法,而不是PrintBannert类的方法。
//下面是一种骚操作,其实就是p的对象实例还是PrintBannert类的实例,可以【强迫转型】调用其内部方法。
((PrintBannert)p).myMethod();
}
}
アダプターパターン(構造タイプ)
再利用のために再パッケージ化する
- プログラムの世界では、直接利用できないコンテンツがある場合、通常は必要な型に変換してから利用する必要があります。
- このデザインパターンは、精巧にパッケージ化された後、ギフトとして使用できる通常の製品のようなもので、特定の内容をパッケージ化した後、他の用途に使用できます。
この変換機能を備えたものは、ラッパーまたはアダプターとして拡張できます。
- アダプターのパターンは 2 つあります。
- クラスのアダプターパターン(継承)
- オブジェクトのアダプター パターン (委任)
使用例:
1. アダプターパターン(継承)
- 既存のコンテンツバナーは、
- コンバーター PrintBanner アダプター
- 必要な結果 印刷インターフェイス (printWeak、printStrong)
2.アダプターパターン(委任)
- ここで、Print を抽象クラスに変更する必要があります。
- PrintBannert は Banner に委任されて実行されます
3. 継承と委任において、クラスの適応であれば継承を利用して適応を利用できますが、オブジェクトの適応であれば適応を利用するために委任方法に変更する必要があります。
使用するシーン
- アダプターパターンを利用することで、必要なメソッド群を作成する手間が省け、プログラムにバグがあった場合でも、既存のクラスに問題がないことが確認できるため、適応したクラスだけを確認するだけで済み、プログラムの負担が軽減されます。検査。
- 作成されたクラスは、新しく作成された API インターフェイスに準拠する必要があります。元のクラスを直接変更せずに適応方法を直接使用できるため、問題が発生する可能性は低くなります。
- バージョンの互換性。アダプターを使用して古いバージョンと新しいバージョンの両方を共存させることができます。
知らせ
アダプタ モードとブリッジ モードの違いは、アダプタが異なるインターフェイス クラスの接続に使用されることです。ブリッジパターンとは、機能フェーズと実装フェーズを繋ぐパターンです。
アダプター パターンとデコレーター パターンの違いは、アダプターがインターフェイス間のギャップを埋めることです。デコレーターモードは、インターフェイスを変更せずに新しい機能を追加できるモードです。
要約する
これにより、互換性のないインターフェイス間の対話が可能になります。アダプター パターンは、インターフェース間の差異を解決して連携できるようにするためによく使用されます。
アダプター パターンは、あるクラスのインターフェイスを別のクラスのインターフェイスに変換することによって機能します。アダプター クラスはターゲット インターフェイスを実装し、1 つ以上のアダプター (アダプターの実装) オブジェクトを含みます。
アダプター クラスはソース インターフェイスを実装し、アダプター クラスに必要なメソッドとプロパティを提供します。
アダプター パターンでは、アダプター クラスは 2 つの異なるインターフェイス間のブリッジとして機能し、ソース インターフェイスからオブジェクトを受け取り、それをターゲット インターフェイスが必要とする形式に変換して、処理のためにターゲット インターフェイスに渡します。
この方法により、インターフェイスの非互換性によるコードのリファクタリングや変更が回避されます。