プロジェクトのソースアドレスします。https://github.com/ggb2312/JavaNotes/tree/master/design-pattern(デザインパターン、関連するコードやメモ)
1.定義
顧客の期待に別のインターフェイスへのクラスのインタフェースを変換します。互換性のないインタフェースのこれらのクラスのためのアダプタモードは一緒に働くことができます。
2.該当シーン
- 既存のクラス、メソッド、およびそれが一致しない必要がある(同じまたは類似の方法で生じます)
- ソフトウェアのデザインパターンは、ソフトウェアのメンテナンスと一緒に、設計段階で考慮されていません。異なる製品ので、異なるメーカーは、インタフェース・ソリューションは同じではありません同様の機能を引き起こします
3.アダプタの種類と役割
オブジェクトアダプタ
委任メカニズムを使用して多重化の組み合わせ、の原則に沿って。
クラスアダプタ
クラスの継承によって実現しています。
図アダプタモードから明らかなようにおよそ3つの役割が含まれています。
ターゲット(抽象クラスを標的とする)抽象クラスは、所望のターゲット顧客インターフェースを定義する、またはインタフェースが抽象クラスで、クラスはコンクリートであってもよいです。クラスのアダプタでは、Java言語は多重継承をサポートしていないので、それが唯一のインタフェースすることができます。
アダプタ(アダプタクラス):それはAdapteeとターゲットを適応させるためのコンバータとして、別のインターフェイスを呼び出すことができます。これは、Adapterパターンの中核です。
Adaptee(適応クラス):クラスすなわち適応適応役割、既存のインタフェースを定義します。このインタフェースは、フィッタクラスは、クライアントがビジネス・メソッドを望んで包まれ、適応が必要です。
4.関連するデザインパターン
モードアダプタモードと外観
- アダプター複合体は、既存のインタフェース、外観モデルとの新しいインタフェースを定義することです。
例5モード
5.1アダプタクラス
Adapteeは、アダプタクラスをされています
public class Adaptee {
public void adapteeRequest() {
System.out.println("被适配者的方法");
}
}
ターゲットターゲットは、インターフェイスメソッドです。
public interface Target {
void request();
}
ConcreteTargetこれは方法の目標は次のとおりです。
/** 具体的实现类 */
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("ConcreteTarget目标方法");
}
}
アダプターそして、これは、適応クラスです:継承されたクラスがインターフェイスメソッドの目標を達成するようになっています。
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
super.adapteeRequest();
}
}
クライアント我々はそれをテストする必要があります。
public class Test {
public static void main(String[]args){
Target target = new ConcreteTarget();
target.request();
/** 现在,我们就来通过适配器类来进行实现 */
Target adapterTarget = new Adapter();
adapterTarget.request();
}
}
テスト結果:
このクラス図では:
5.2オブジェクトアダプタ
ターゲット・インタフェースがあります:
public interface Target {
void request();
}
特定のターゲットクラスがあります:
/** 具体的实现类 */
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("ConcreteTarget目标方法");
}
}
そして、クラスを適応:
public class Adaptee {
public void adapteeRequest() {
System.out.println("被适配者的方法");
}
}
上記適応クラスといくつかの違いがありますが、ここでの適応クラスは継承ではなく、内部への属性の組み合わせとして、オブジェクトの内部クラスのメソッドを呼び出すように適応されていません。
public class Adapter implements Target {
private Adaptee adaptee = new Adaptee();
@Override
public void request() {
adaptee.adapteeRequest();
}
}
テスト:
public class Test {
public static void main(String[]args){
Target target = new ConcreteTarget();
target.request();
/** 现在,我们就来通过适配器类来进行实现 */
Target adapterTarget = new Adapter();
adapterTarget.request();
}
}
テスト結果:
このクラス図では:
5.3アダプタのデモ
シンプルな抽象的なシーン: - > DC5V私たちのデモのDC 5Vの携帯電話のリチウム電池のニーズに220V ACへのニーズを充電する携帯電話は、電源アダプタ、AC220Vを書くことです
220Vクラス:まず、クラスの適応があります
public class AC220 {
public int outputAC220V() {
int output = 220;
System.out.println("输出220V的交流电"+output+"V");
return output;
}
}
DC 5V:我々はゴール方式のインターフェースを持っています
public interface DC5 {
int outputDC5V();
}
これは、(オブジェクトアダプタを使用して)適応クラスです。
public class PowerAdapter implements DC5 {
private AC220 ac220 = new AC220();
@Override
public int outputDC5V() {
int adapterInput = ac220.outputAC220V();
/** 变压器 */
int adapterOutput = adapterInput / 44;
System.out.println("通过PowerAdapter电源适配器输入AC"+adapterInput+"V"+"输出DC:"+adapterOutput+"V");
return adapterOutput;
}
}
テスト:
public class Test {
public static void main(String[]args){
DC5 dc5 = new PowerAdapter();
dc5.outputDC5V();
}
}
テスト結果:
6.長所と短所
利点:
- クラスは、透明性および多重化、多重化既存のクラスが、変更なしを向上させることができます
- アダプタクラスとクラスのデカップリングターゲット、プログラムのスケーラビリティを向上させます
- 開閉の原則に沿って、
短所:
- アダプタ書き込み処理は完全なアカウントを取る、それはシステムの複雑さを増大させることができます
- 難易読めるシステムコードを増やします
7.拡張-JDK1.7とソース・アダプタ・モードのフレーム
javax.xml.bind.annotation.adapters.XmlAdapter
org.springframework.aop.framework.adapter.AdvisorAdapter、MethodBeforeAdviceAdapter
org.springframework.orm.jpa.JpaVendorAdapter
org.springframework.web.servlet.HandlerAdapter、org.springframework.web.servlet.DispatcherServlet、org.springframework.web.servlet.mvc.Controller