グラフィックアダプタモードJavaのデザインパターン
のアダプタ実際の例
あなたが使用できるように、2つの穴(欧州規格)とのタイソケットは、多機能アダプタープラグ(アダプタ)を購入することができます。
アダプタモードの基本的な導入
1)アダプタモード(アダプタパターン)インターフェイスに変換する、クライアント・インターフェースは、さらに、所望を示し、主な目的は、2つのクラスが一緒に働くことができると、元と一致していないインタフェースが原因仕事にすることができないように、互換性です。これラッパーエイリアス(ラッパー)
2)構造アダプタモードモードである
3)3つのカテゴリに分類:クラスアダプタモード、オブジェクト・アダプタ・モード、インタフェースアダプタモード
アダプタモードの動作
動作
に別のインタフェースへのクラスのインターフェースを変換:1)アダプタモードをので、元のインターフェースに互換性互換性クラスではないことを
切り離されるように適合することができないユーザの視点から2)、
3)ユーザのコールが次いで、アダプタの呼は、関連するインタフェース方式に適合されている方法アウトアダプタインタフェース変換対象、
4)ユーザは、フィードバック結果を受信し、ターゲット・インターフェース相互作用のみように感じます
クラスAdapterパターン
クラスアダプタモデルでは説明
基本を:クラスの継承srcでアダプタクラスは、クラスインターフェイス、完全なSRC実装DST - 「DSTの適応を。
クラスアダプタモデルの応用例
1)の例が示す
、充電アダプタの寿命を説明するために例のSRC(すなわちフィッター)に対する敬意アダプタ、220V ACで充電器自体が、私たちの目標DST(すなわち、ターゲット)があります5V DC
2)思考分析(図クラス)
package com.example.demo.adapter.classadapter;
public class Voltage220V {
/**
* 输出220V的电压
*/
public int output220V() {
int src = 220;
System.out.println("电压 = " + src + "伏");
return src;
}
}
package com.example.demo.adapter.classadapter;
public interface IVoltage5V {
int output5V();
}
package com.example.demo.adapter.classadapter;
/**
* 适配器类
* @author zhaozhaohai
*
*/
public class VoltageAdapter extends Voltage220V implements IVoltage5V{
@Override
public int output5V() {
// 获取到220V电压
int srcV = output220V();
// 转成5v
int dstV = srcV / 44;
return dstV;
}
}
package com.example.demo.adapter.classadapter;
public class Phone {
/**
* 充电
* @param iVoltage5V
*/
public void charging(IVoltage5V iVoltage5V) {
if (iVoltage5V.output5V() == 5) {
System.out.println("电压为5V,可以充电~~");
} else if (iVoltage5V.output5V() > 5) {
System.out.println("电压大于5V,不能充电~~");
}
}
}
package com.example.demo.adapter.classadapter;
public class Client {
public static void main(String[] args) {
System.out.println(" === 类适配器模式 ===");
Phone phone = new Phone();
phone.charging(new VoltageAdapter());
}
}
クラス注意Adapterパターンと詳細
;クラスは、それがdstがインターフェイスでなければならない必要があるため、一定の制限があるという欠点と考えることができる継承SRCアダプタクラスする必要があるので、1)Javaは、単一継承メカニズムである
2)メソッドSRCクラスは、アダプタ内に露出され、また、増加します使用のコスト。
3)に起因し、そのSRC継承クラスに、そのような拡張の柔軟性アダプタクラス、そのクラスのSRCのニーズに記載の方法を上書きできるように。
オブジェクトアダプタモード
1)基本的な考え方と同じパターンのアダプタクラスを、しかし、アダプタクラスを改正し、継承されていないSRCクラスが、クラスはアドレスの互換性の問題に、SRCのインスタンスを開催されます。すなわち: - 「DSTのアダプタクラスは、完全なSRCを達成するために、SRC、DSTクラスインターフェイス保持
の使用にするシステムでは、2)」多重化の原則の合成」を代わりに継承協会(集約)を関係。
3)オブジェクトアダプタモードアダプタは、一般的にモデルとして使用されています
package com.example.demo.adapter.objectadapter;
/**
* 被适配的类
* @author zhaozhaohai
*
*/
public class Voltage220V {
/**
* 输出220V的电压
*/
public int output220V() {
int src = 220;
System.out.println("电压 = " + src + "伏");
return src;
}
}
package com.example.demo.adapter.objectadapter;
/**
* 适配接口
* @author zhaozhaohai
*
*/
public interface IVoltage5V {
int output5V();
}
package com.example.demo.adapter.objectadapter;
/**
* 适配器类
* @author zhaozhaohai
*
*/
public class VoltageAdapter implements IVoltage5V{
/**
* 关联关系 - 聚合
*/
private Voltage220V voltage220V;
/**
* 通过构造器,传入一个Voltage220V 实例
* @param voltage220v
*/
public VoltageAdapter(Voltage220V voltage220v) {
this.voltage220V = voltage220v;
}
@Override
public int output5V() {
int dstV = 0;
if (voltage220V != null) {
// 获取220V 电压
int src = voltage220V.output220V();
System.out.println("使用对象适配器,进行适配~~");
dstV = src / 44;
System.out.println("适配完成,输出的电压为 = " + dstV);
}
return dstV;
}
}
package com.example.demo.adapter.objectadapter;
public class Phone {
/**
* 充电
* @param iVoltage5V
*/
public void charging(IVoltage5V iVoltage5V) {
if (iVoltage5V.output5V() == 5) {
System.out.println("电压为5V,可以充电~~");
} else if (iVoltage5V.output5V() > 5) {
System.out.println("电压大于5V,不能充电~~");
}
}
}
package com.example.demo.adapter.objectadapter;
public class Client {
public static void main(String[] args) {
System.out.println(" === 对象适配器模式 ===");
Phone phone = new Phone();
phone.charging(new VoltageAdapter(new Voltage220V()));
}
}
オブジェクトアダプタパターンの注意と詳細
1)実際にはオブジェクトアダプタとクラスアダプタが同じ考えではなく、別の方法で実現します。
それは、アダプタの制限に対処そうすることを、原則として、代替継承の組み合わせを多重合成は、srcのクラスを継承しなければならない、DSTはもはやインターフェースを必要としてはなりません。
下部2)コスト、およびより柔軟。
インタフェースアダプタモード
1)いくつかの本と呼ばれる:アダプタモード(デフォルトAdapterパターン)またはデフォルトのアダプタモード。
何インターフェイスが完全達成するための方法を提供しない場合、抽象クラスインターフェースを実装し、各インターフェイスのインプリメンテーション(空の方法デフォルト)方法を提供するように設計することができる2)、このクラスの抽象サブクラスを選択することができメソッドにいくつかのクラスの親クラスの実装要件をオーバーライドする
)ケース3そのインタフェースのメソッドを使用するために、すべてたいと適用されます
package com.example.demo.adapter.interfaceadapter;
public interface Interface4 {
public void m1();
public void m2();
public void m3();
public void m4();
}
package com.example.demo.adapter.interfaceadapter;
/**
* 在AbsAdapter 我们将Interface4 的方法进行默认实现
* @author zhaozhaohai
*
*/
public abstract class AbsAdapter implements Interface4{
@Override
public void m1() {
// TODO Auto-generated method stub
}
@Override
public void m2() {
// TODO Auto-generated method stub
}
@Override
public void m3() {
// TODO Auto-generated method stub
}
@Override
public void m4() {
// TODO Auto-generated method stub
}
}
package com.example.demo.adapter.interfaceadapter;
public class Client {
public static void main(String[] args) {
AbsAdapter absAdapter = new AbsAdapter() {
/**
* 只需要去覆盖我们需要使用的接口方法
*/
@Override
public void m1() {
System.out.println("使用类m1的方法");
}
};
absAdapter.m1();
}
}
ソースアプリケーションSpringMVCで分析アダプタモードフレーム
1)HandlerAdapterでSPRINGMVC、クラスアダプタモードの使用に関する
2)SpringMVCフロー見直し要求処理
HandlerMappingてコントローラをマッピングする(1)
アダプタを取得するために(2)
のModelAndViewは、アダプタ呼制御戻るにより(3)
のHandlerAdapterにサブ実装クラス、各コントローラは、アダプタの実装クラスの対応する使用があり、各コントローラは、異なる実装がある
3)理由HandlerAdapter分析の使用:
あなたは、プロセッサの種類を見ることができます、している複数の実装、途中で通話があなたは、あなたが他にあればどのような種類の種子、次に実行裁判官に一定の使用を必要とするときに呼び出す必要があり、直接コントローラメソッドを呼び出す必要があるかどうかは、定かではありません。あなたはコントローラーの後ろに拡張したいのであれば、あなたは、元のコードを変更するためにOCPの原則に反するようにしています。
SpringMVCアダプタコントローラデザインパターンを介して対応するソースコードを書くこと得る4)手
package com.example.demo.adapter.sprringmvc;
/**
* 多种Controller实现
* @author zhaozhaohai
*
*/
public interface Controller {
}
class HttpController implements Controller {
public void doHttpHandler() {
System.out.println("http....");
}
}
class SimpleController implements Controller {
public void doSimplerHandler() {
System.out.println("simple...");
}
}
class AnnotationController implements Controller {
public void doAnnotationHandler() {
System.out.println("annotation...");
}
}
package com.example.demo.adapter.sprringmvc;
/**
* 定义一个Adapter接口
* @author zhaozhaohai
*
*/
public interface HandlerAdapter {
public boolean supports(Object handler);
public void handle(Object handler);
}
/**
* 多种适配器类
* @author zhaozhaohai
*
*/
class SimpleHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return handler instanceof SimpleController;
}
@Override
public void handle(Object handler) {
((SimpleController) handler).doSimplerHandler();
}
}
class HttpHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return handler instanceof HttpController;
}
@Override
public void handle(Object handler) {
((HttpController) handler).doHttpHandler();
}
}
class AnnotationHandlerAdapter implements HandlerAdapter {
@Override
public boolean supports(Object handler) {
return handler instanceof AnnotationController;
}
@Override
public void handle(Object handler) {
((AnnotationController) handler).doAnnotationHandler();
}
}
package com.example.demo.adapter.sprringmvc;
import java.util.ArrayList;
import java.util.List;
public class DispatchServlet {
public static List<HandlerAdapter> handlerAdapters = new ArrayList<HandlerAdapter>();
public DispatchServlet() {
handlerAdapters.add(new AnnotationHandlerAdapter());
handlerAdapters.add(new HttpHandlerAdapter());
handlerAdapters.add(new SimpleHandlerAdapter());
}
public void doDispatch() {
// 此处模拟SpringMVC从request取handler的对象,
// 适配器可以获取到希望的Controller
// HttpController controller = new HttpController();
AnnotationController controller = new AnnotationController();
// SimpleController controller = new SimpleController();
// 得到对应适配器
HandlerAdapter adapter = getHandler(controller);
// 通过适配器执行对应的Controller对应方法
adapter.handle(controller);
}
private HandlerAdapter getHandler(AnnotationController controller) {
for (HandlerAdapter adapter : this.handlerAdapters) {
if (adapter.supports(controller)) {
return adapter;
}
}
return null;
}
public static void main(String[] args) {
new DispatchServlet().doDispatch();
}
}
説明:
1)は、対応するアダプタの実装クラスが存在するようにスプリング、各コントローラにアダプタインターフェイスを定義する
代わりに、アダプタコントローラそれぞれの方法の2)
)3は、拡張コントローラのみクラスSpringMVCを完了するために、アダプタクラスを追加する必要があります拡張クラス
4)、これはデザインパターンの電力であります
NotesとAdapterパターンの詳細
SRCに基づいているという名前の1)3は、命名さ)形式でアダプタ(アダプタを与えることを形成するものです。
2)アダプタクラス:クラスを与えるために、アダプタの年で、それは、クラス、継承などSRCにある
オブジェクトアダプタ:オブジェクトがオブジェクトとして、SRCにアダプタで、提供することです、ホールド
インタフェースアダプタを:インターフェイスに与えること、でインタフェースとしてSRCでアダプタ、
3)アダプタ最大の役割モデルは一緒に仕事を本来非互換インタフェースである
4)実際の開発、強固3つの古典的な形式に準拠しない実装します