前文
SPRINGMVC(高度なパラメータは、リストタイプ、RequestMapping @、バインディング要求メソッドを定義し、この方法は、値コントローラを返します)
記事のディレクトリ
アダプタモード
基本的な導入
- アダプタパターンがインタフェースに変換され、クライアント・インターフェースは、別の所望表し、主な目的は、インターフェイスが一致しないため、元の作品が一緒に2つのクラスが(パッケージングのために、一緒にエイリアスを動作しないことができるように、互換性でありますラッパー)
- アダプタパターンは、構造モデルに属し
- タイプアダプタモード、オブジェクトアダプタモード、インタフェースアダプタモード:3つのカテゴリに分類
アダプタモードの動作
- アダプタモード:元のインターフェースに互換性クラス互換性がないように、別のインターフェイスへのクラスのインターフェースを変換
- ユーザーの観点からは切り離されて、誰に適応することができません
- ユーザーは、ターゲット・インタフェース・メソッドのうち、変換アダプタを呼び出し、その後、アダプタの関連インタフェースは適応呼び出します
- ユーザーは、フィードバックの結果を受けて、それがターゲット・インタフェースの相互作用であることを感じます
クラスAdapterパターンの実装
package com.java.springtest.classadapter;
// 被适配的类
public class Voltage {
// 输出 220V 的电压
public int outPut220V() {
int src = 220;
System.out.println("电压=" + src + "V");
return src;
}
}
package com.java.springtest.classadapter;
/**
* @author Woo_home
* @create by 2020/2/17
*/
// 适配接口
public interface IVoltage {
int outPut();
}
package com.java.springtest.classadapter;
public class VoltageAdapter extends Voltage implements IVoltage {
@Override
public int outPut() {
// 获取到 220V 电压
int srcV = outPut220V();
int dstV = srcV / 44;
return dstV;
}
}
package com.java.springtest.classadapter;
public class Phone {
// 充电
public void changing(IVoltage iVoltage) {
if (iVoltage.outPut() == 5) {
System.out.println("电压为 5V,可以充电");
} else if (iVoltage.outPut() > 5) {
System.out.println("电压大于 5V,不能充电");
}
}
}
package com.java.springtest.classadapter;
public class Client {
public static void main(String[] args) {
System.out.println("----------- 类适配器模式 ------------");
Phone phone = new Phone();
phone.changing(new VoltageAdapter());
}
}
出力:
Notesとクラスアダプタパターンの詳細
- Javaはクラスが、それはdstがインターフェイスでなければならない必要があるため、欠点と見なすことができる継承SRCアダプタクラスに必要なので、いくつかの制限があり、単一継承メカニズムであります
- アダプタクラスにおけるSRCの方法を露出するだけでなく、使用のコストが増大します
- それは需要に応じてオーバーライドされたメソッドSRCクラスにすることができるので、その継承のsrcクラスで、作りアダプタは、柔軟性を向上します
オブジェクトアダプタパターンの実装
package com.java.springtest.classadapter;
// 被适配的类
public class Voltage {
// 输出 220V 的电压
public int outPut220V() {
int src = 220;
System.out.println("电压=" + src + "V");
return src;
}
}
package com.java.springtest.classadapter;
// 适配接口
public interface IVoltage {
int outPut();
}
package com.java.springtest.classadapter;
public class VoltageAdapter implements IVoltage {
private Voltage voltage;
public VoltageAdapter(Voltage voltage) {
this.voltage = voltage;
}
@Override
public int outPut() {
int dst = 0;
if (null != voltage) {
int src = voltage.outPut220V();// 获取 220V 电压
dst = src / 44;
}
return dst;
}
}
package com.java.springtest.classadapter;
public class Phone {
// 充电
public void changing(IVoltage iVoltage) {
if (iVoltage.outPut() == 5) {
System.out.println("电压为 5V,可以充电");
} else if (iVoltage.outPut() > 5) {
System.out.println("电压大于 5V,不能充电");
}
}
}
package com.java.springtest.classadapter;
public class Client {
public static void main(String[] args) {
System.out.println("----------- 对象适配器模式 ------------");
Phone phone = new Phone();
phone.changing(new VoltageAdapter(new Voltage()));
}
}
NotesとAdapterパターンのオブジェクトの詳細
- 実際にはオブジェクトアダプタとクラスアダプタ同じ考えが、異なる実装も、それはクラスアダプタの限界を解決して、代替の継承の組み合わせを使用して、多重化の原則に従って合成srcとdstのを継承しなければなりませんが、もはやインタフェースを必要としないしなければなりません
- より柔軟な低コストの使用は、
インタフェースアダプタモード
基本的な導入
- アダプタモードまたはデフォルトモードアダプタ:として知られているいくつかの本
- 何インターフェイスはインターフェイス抽象クラスが実装すること、及び(ヌル方法)各インターフェイスのためのデフォルトの方法を実施するように設計され実装されるすべてのメソッドを提供しない場合、このクラスの抽象サブクラスは、選択的親をオーバーライドすることができクラスの要件を達成するために、いくつかの方法
- 場合にも適用するインターフェイスのすべてのメソッドを使用したくありません
アダプタモデルのアプリケーションとソースフレームSpringMVCの分析
- HandlerAdapterでSpringMVCはアダプタモードを使用することです
- リクエスト処理ワークフローSpringMVC
- HandlerAdapter分析を使用する理由:あなたは、プロセッサの種類を見ることができ、達成するための複数の方法があり、その後、道を呼び出すには、あなたが直接コントローラメソッドを呼び出す必要がある場合は、あなたが他にあればどれを決定するために使用する必要があるときに常に呼び出す必要があり、不確実ですその後、シードクラスを実行します。後者はコントローラを拡張するのであれば、あなたは、OCPの原則に反するので、コードの後ろを変更する必要があります
SpringMVCと前述の使用についてであり見ることができません
次のコードは、コントローラHandlerMappingをマッピングすることによって、()メソッドでdoDispatch DispatchServletある
コントローラにコントローラの定義を取得した後、次のコードはmappedHandler.getHandler()、getHandlerAdapter()メソッドの戻りアダプタです。なぜあなたは、アダプタを返すようにしたいですか?別のアダプタが処理されるように、適切なメソッドを呼び出すために別のハンドラを使用するので
、我々はgetHandlerAdapter()このメソッドが実行してどのように見て
コードgetHandlerAdapter(から見ることができますが)私たちが見て、HandlerAdapterを返します。 HandlerAdapterが何かあるの下で
、我々は、このインタフェースは、どのようなクラスの実装を見て
、我々はgetHandlerAdapterを探し続けて()メソッドは、HandlerAdapterのどのリターンです
private List<HandlerAdapter> handlerAdapters;
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
// 判断 handlerAdapters 是否为空
if (this.handlerAdapters != null) {
// 如果不为空,则遍历 handlerAdapters
Iterator var2 = this.handlerAdapters.iterator();
while(var2.hasNext()) {
HandlerAdapter adapter = (HandlerAdapter)var2.next();
// 大家看过上面 HandlerAdapter 的源码之后会发现在 HandlerAdapter 有一个方法
// 是 supports,而这里的方法就是 HandlerAdapter 中的
// 这里是判断适配器处理器支不支持这个处理器
if (adapter.supports(handler)) {
// 如果支持则返回这个适配器处理器
return adapter;
}
}
}
throw new ServletException("No adapter for handler [" + handler + "]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler");
}
そして、これは実際にはアダプターメソッドを呼び出すことにより、当社のコントローラー、コントローラーのコールを処理し、上記のコードのMVでのModelAndView(インターフェース()メソッドで定義されたハンドルHandlerAdapter)を返しています
概要
HandlerAdapter実装は、異なる実装コントローラとそれぞれ、対応する実装クラスがあるので、各アダプタ、コントローラのサブクラス
SpringMVC自身が対応するソースコードのデザインパターンのコントローラーにアダプタを介して達成するために取得します
説明:
- スプリングは、アダプタクラスを有するように、アダプタ・インターフェースを定義する対応するコントローラに実装する各
- あるいはコントローラアダプタそれぞれの方法が実行されます
- 拡張コントローラは、唯一SpringMVCの展開を完了するために、アダプタクラスを追加する必要がある場合
コードコードは、必要としている次の友人が見ることができる、クラウドにアップロードされている自分がSpringMVCを達成します