序文 -
この記事では、情報提供のみを目的とし、確かにそれで多くの間違っていると、行う個人的なメモの性質を整理するために学ぶことです。
(第IX章・インターフェース "Javaで思考")
インタフェースは、抽象クラスのちょうどより純粋な形ではありません
テキスト -
インターフェースは抽象クラスのちょうどより純粋な形ではない、彼の目標はそれよりもさらに高くなっています。例えば、「完全なデカップリング」と「多重継承」
最初はされて完全に分離され、あなたはクラスではなくインタフェースの動作方法限り、カップリングのいくつかの理解を持つようにしたいということ、そしてあなただけの、このクラスおよびそのサブクラスを使用することができます。
プロセッサは、今、私たちは、名前()メソッドおよびprocess()メソッドを含むクラスを持っています。プロセッサ処理()メソッドを継承スプリッタとオーバーライドメソッドは、空の文字列Geqie分割に係る機能を実現します。
適用において、Apply.process()メソッドは、(それがプロセッサから継承されている限り)プロセッサの任意のタイプを受け入れ、オブジェクトに適用するオブジェクトであり、その結果を印刷してもよいです。
クラスプロセッサ{ パブリック文字列名(){ リターンのgetClass()getSimpleName()。 } オブジェクト処理(オブジェクト入力){ リターン入力; } } クラススプリッタは延びプロセッサ{ @Override オブジェクト処理(オブジェクト入力){ // TODO自动生成的方法存根 戻り Arrays.toString(((String)を入力).splitを(」 " )); } } パブリック クラスは、{適用 パブリック 静的 ボイドプロセス(プロセッサP、オブジェクトS){ System.out.printlnは("使用してプロセッサ" + p.name()); System.out.println(p.process(S))。 } 公共の 静的な文字列S =「私はあなたの赤ちゃんを愛し」。 パブリック 静的 ボイドメイン(文字列[]引数){ 工程(新しいスプリッタ()、S)。 } }
※このような例のように、この方法によると呼ばれる異なる挙動が異なるパラメータオブジェクトの伝道と、作成することができる戦略設計パターンを。このような方法は、固定された部分で実行されるアルゴリズムを含む、及び「戦略」セクションには変更が含ま。
※戦略が実行されるコードが含まれているオブジェクトにパラメータを渡すことです。ここでは、プロセッサは戦略です。
しかし、これらはスプリッタの実装が焦点ではありません、フォーカスではありません。
プロセッサの外観を覚えておいてください!それは鍵です!
次に、クラスの別のセット
パブリック クラス波形{ // 波形类 プライベート 静的 長い数えます。 民間 最終 長い ID =数++ ; パブリック文字列のtoString(){ 戻り "波形" + ID。 } } クラスフィルター{ // 适配器类 パブリック文字列名(){ リターンのgetClass()getSimpleName()。 } オブジェクト処理(波形入力){ リターン入力; } } クラスの帯域が延びフィルター{// フィルタタイプ ダブル lowCutoff、hightCutoff; 公共バンドパス(ダブル lowCutoff、ダブルhightCutoff){ // TODO自動生成されたコンストラクタスタブ この .lowCutoff = lowCutoff; この .hightCutoff = hightCutoff; } @Override オブジェクト処理(波形入力) { // 方法スタブTODO自動生成された リターンINPUT; } }
フィルタとプロセッサの観察は、彼女の2つの要素が同じインタフェースを持っています。あなたはミアン方法でApply.process(P、S)の静的を呼び出そう;,コンパイラは、プロセスを適用するプロンプトが表示されます(P、S)は適用されません。あなたはこの方法ではないですので、クラスに継承構造に適用されます。
※時にプロセッサにApply.process間の密結合()。
このインタフェースの使用が大幅に緩和カップルすることができ、今、私たちは、インターフェイスタイプのプロセッサを変更します
パブリック インターフェイスiProcessor { 文字列名(); オブジェクト処理(オブジェクトINPUT); } パブリック クラス StringProcessor 実装iProcessor { 公共の 静的な文字列S =「私の愛、あなたの赤ちゃん」; 公共の 静的な 無効メイン(文字列[] args)を{ // 自動的にTODO生成されたメソッド・スタブ NewApply.process(新しい新しいスプリッタ()、S); } @Override パブリック文字列名(){ // メソッドTODO自動的に生成されたスタブは、 戻りのgetClass()getSimpleName();. } @Override パブリックオブジェクト処理(オブジェクト入力){ // メソッドスタブが自動的に生成されたTODOの 戻りINPUT; } } クラスNewApply { 公共 静的 ボイドプロセス(プロセッサP、Sオブジェクト){ するSystem.out.println( "使用して、プロセッサは、" + p.name ()); のSystem.out.println(p.process(S)); } } クラス NewSplitter 延びStringProcessor { @Override パブリックオブジェクト処理(オブジェクトINPUT){ // メソッドTODO自動的に生成されたスタブを 返す(((Arrays.toStringのString)をINPUT).split( "" )); } }
今、プロセッサはiProcessorへのインタフェースは、それがWavefformに適用されるか、でしょうか?
あなたは使用することができ、アダプタのデザインパターンを。受け入れられたインターフェース(タイプ)を使用するには、アダプタを介して、アダプタを持っている、とあなたが必要とするインターフェイス(タイプ)を生成します。
パブリック クラス FilterAdapter 実装iProcessor { フィルタF; 公共FilterAdapter(フィルタF){ // TODO自動生成されたコンストラクタスタブ この .F = F; // だけfiterに適合渡さないであろう } @Override パブリック文字列名() { // 自動的に生成されたメソッドスタブTODO リターンF.Name(); } @Override パブリックオブジェクト処理(オブジェクト入力){ // メソッドスタブが自動的に生成されたTODOの 戻りf.process((波形)INPUT); } }
パブリック クラスFilterProcessor { 公共 静的 ボイドメイン(文字列[]引数){ // メソッドTODO自動的に生成されたスタブ 波形W = 新しい新しい波形(); NewApply.process(新しい新しい FilterAdapter(新しい新しいバンドパス(3.0、4.0 ))、W)。 } }
あなたは、元を持っている、とあなたが必要とするインターフェースiProcessorオブジェクトを生成した入力フィルターアダプターを受け入れ、私たちはそう。
※アダプタは非常に実用的に見えるが、できるだけ彼女を使用していますが。あなたは過度の変換アダプタを使用するときは、設計が間違っているものではありません再考すべきです。