アダプターモード
アダプターパターン(英語:アダプターパターン)の定義は、パッケージスタイルまたはパッケージと呼ばれることもあります。クラスのインターフェイスをユーザーが期待するものに転送します。適応により、インターフェイスの互換性のために連携できないクラスが作成されます。
アダプターモードには2つのタイプがあります。
1。オブジェクトアダプターモード - オブジェクトアダプターは、関連性を介してユーザーの期待インターフェイスを満たし、コード間の悪い結合を減らします。仕事に「オブジェクト適応」を使用することをお勧めします。
2。クラスアダプターモード - このアダプターモードでは、アダプターは実装されたクラス(通常は複数の継承)を継承します。 Javaには複数の継承がないので、ここでは紹介しません。
成し遂げる
1。ターゲット - クライアントが使用する必要がある方法を定義します。
2。アダプター - ターゲットを継承または実装し、ターゲットへの適応方法に適応します。
3。適応者 - 既存の方法を定義します。
4。クライアント - ターゲットの呼び出しメソッド。
public class adaptee {public void speciate request(){system.out.println( "hello、私はadapteeから来ました!"); }} public interface target {public void request(); }パブリッククラスアダプターはターゲットを実装しています{Adaptee Adaptee; public adapter(){adaptee = new adaptee(); } public void request(){adaptee.specificrequest(); }} public class client {public static void main(string [] args){ターゲットターゲット= new Adapter(); Target.Request(); }}クラスアダプターパターンを実装するには、適応者を継承するためにアダプターが必要です。
適用可能なシナリオ
1.古いクラスを使用し、そのインターフェイスがニーズを満たしていない場合は、アダプタークラスを調停クラスとして使用できます。
2。使用するためのいくつかの無関係なクラスのインターフェイスを呼び出すことができる汎用クラスを作成する必要があります。
ブリッジモード
動機付けは、抽象的に異なる実装を持つ必要があります。たとえば、データを保存するには2つの方法があります。1つはファイルメソッド、もう1つはデータベースメソッドです。通常のプラクティスは、データを保存するクラスを継承し、データを保存するさまざまな方法を実装することです。これの問題は、保存方法を変更して拡張することが困難であり、実行時に保存方法を切り替えることができないことです。
ブリッジパターンを定義することは、ソフトウェア設計パターンで最も複雑なパターンの1つであり、物事の抽象的な部分を実装パーツから分離して、すべて独立して変更できるようにします。
たとえば、「円」と「三角形」は抽象「形状」の下に分類され、「描画サークル」と「描画三角形」は、動作を実現する「図面」カテゴリの下に分類され、「描画」は「形」で呼ばれます。
1。要約 - 抽象的なメソッドを定義します。
2。abstractimpl-実装インターフェイスを使用して、抽象メソッドを実装します。
3。実装者 - 特定の実装動作のインターフェイスを定義します。
4。ConcreteImplementor1、Concreteimplementor2-実装インターフェイスを実装します。
/ ** "実装者"*/インターフェイスDrawingApi {public void Drawcircle(double x、double y、double radius); }/** "concreteimplementor" 1/2*/class drawingapi1はdrawingapi {public void drawcircle(double x、double y、double radius){system.out.printf( "api1.circle at%f:%f radius%f/n"、x、y、radius); }}/** "concreteimplementor" 2/2*/class drawingapi2はdrawingapi {public void drawCircle(double x、double y、double radius){system.out.printf( "api2.circle at%f:%f radius%f/n"、x、y、radius); }} / ** "abstraction"* / interface shape {public void draw(); //低レベルのパブリックボイドResizeByPercentage(double pct); //ハイレベル}/ ** "洗練された抽象化"*/ class circlesshape frames shape {private double x、y、radius; Private Drawingapi DrawingApi;パブリックサークルシャープ(ダブルX、ダブルY、ダブル半径、DrawingApi DrawingApi){this.x = x; this.y = y; this.radius = radius; this.drawingapi = drawingapi; } //低レベルIE実装固有のpublic void draw(){drawingapi.drawcircle(x、y、radius); } //高レベルIE抽象固有のpublic void resizebypercentage(double pct){radius *= pct; }} / ** "Client"* / class BridgePattern {public static void main(string [] args){shape [] shapes = new Shape [2]; shapes [0] = new Sirclesshape(1、2、3、new DrawingApi1()); shapes [1] = new Sirclesshape(5、7、11、new DrawingApi2()); for(shape shape:shapes){shape.resizebypercentage(2.5); shape.draw(); }}}例
1.動機に記載されているデータを保存します。
2。グラフィックスの描画フレーム。上記のコードの実装と同様です。
適用可能なシナリオ
1.抽象化と実装が固定された関係を持つことは望ましくありませんが、実行時に実装を変更できることを願っています。
2.抽象的なパーツと実装パーツの両方は、互いに影響を与えることなく独立して拡張できます。