書籍「Head First。 デザインパターン。 更新された周年記念版»

画像 世界では、誰かがあなたと同じプログラミングの問題に常に直面しています。 多くの開発者は完全に同一の問題を解決し、同様の解決策を見つけます。 車輪を再発明したくない場合は、この本での作業に専念している既製のデザインパターン(パターン)を使用してください。



多くの開発者がプロ​​グラムの柔軟性と再利用度を高める方法を探していたため、パターンが登場しました。 見つかった解決策は、簡潔で簡単に実行可能な形式で具体化されています。



この出版物の特異性は、プログラミングに関する多くの退屈な本の中で「頭が先」のオライリーシリーズを強調する、資料を提示するユニークな方法です。 ダラは「ラムダ式を使用してRemoteControlコードを簡素化する」という文章を紹介しました



既に見たように、チームパターンはかなり単純です。 ただし、Java言語は、コードをさらに簡素化する便利なツール、つまりラムダ式を提供します。 ラムダ式は、使用される場所でメソッドを(計算のシーケンスとして)記述するための省略形です。 メソッドを使用して個別のクラスを作成し、このクラスのインスタンスを作成してからメソッドを呼び出す代わりに、ラムダ式を使用して「ここに呼び出されるメソッドがあります」と指定するだけです。 この場合、execute()メソッドを呼び出す必要があります。



これがどのように行われるかを理解するには、LightOnCommandオブジェクトとLightOffCommandオブジェクトを置き換えます

ラムダ式。 次の手順に従って、コマンドオブジェクトの代わりにラムダ式によって実装されるライトオン/オフコマンドを作成します。



ステップ1.レシーバーを作成する

画像






ステップ2.ラムダ式を使用してリモート制御コマンドを実装する



これは、すべての楽しみが起こる場所です。 現在、LightOnCommandおよびLightOffCommandオブジェクトを作成してremoteControl.setCommand()を渡す代わりに、各オブジェクトの代わりに対応するexecute()メソッドからのコードを使用してラムダ式を渡すだけです。



画像






ステップ3.ボタンを有効にする



このステップも変更されていません-onButtonWasPushed(0)メソッドが呼び出されると、スロット0のコマンドは関数オブジェクト(ラムダ式を使用して作成)で表されるという事実を除きます。 コマンドでexecute()を呼び出すと、このメソッドはラムダ式で定義されたメソッドにマッピングされ、ラムダ式が実行されます。



画像






ラムダ式を使用してCommandオブジェクトを置き換え、Commandインターフェイスにはメソッドexecute()が1つだけ含まれています。 使用するラムダ式には互換性のあるシグネチャが必要です。つまり、execute()メソッドは引数(ラムダ式など)を受け取らず、値(ラムダ式など)を返しません。 コンパイラはすべてに満足しています。 ラムダ式は、setCommand()メソッドのCommandパラメーターで渡されます。



画像






要確認:ラムダ式が渡されるパラメーターインターフェイスに1つ(そして1つだけ!)メソッドが含まれ、このメソッドのシグネチャがラムダ式のシグネチャと互換性がある場合、すべてが正常に機能します。



メソッドリンク



コードをさらに簡素化するために、メソッドへのリンクを使用できます。 渡されたラムダ式が、ラムダ式の代わりに1つのメソッドのみを呼び出す場合、

メソッドへのリンクを渡します。 これは次のように行われます。



画像






オブジェクトのon()メソッドを呼び出すラムダ式を渡す代わりに

livingRoomLight、メソッド自体へのリンクを渡します。



しかし、ラムダ式が一度に複数の操作を実行する必要がある場合はどうでしょうか?



Commandオブジェクトを置き換えるために使用されるラムダ式は、1つの操作に限定されない場合があります。 stereoOnWithCDCommandオブジェクトを置き換える方法を見てみましょう

stereoOffCommandラムダ式。 以下は、これらすべてのアイデアがどのように組み合わされるかを理解できるように、完全なRemoteLoaderコードです。



stereoOffCommandオブジェクトは、単純なコマンドを1つだけ実行します。



stereo.off();
      
      





このコマンドでは、ラムダ式の代わりに、ステレオ:: offメソッドへのリンクを使用できます。

ただし、stereoOnWithCDCommandは1つではなく3つの操作を実行します。



 stereo.on(); stereo.setCD(); stereo.setVolume(11);
      
      





この場合、メソッドリンクの使用は失敗します。 代わりに、組み込み形式でラムダ式を記述するか、個別に作成して名前を割り当ててから、名前でremoteControlオブジェクトをsetCommand()メソッドに渡す必要があります。 作成オプション

別のラムダ式とそれに名前を付けると、次のようになります。



 Command stereoOnWithCD = () -> { stereo.on(); stereo.setCD(); stereo.setVolume(11); }; remoteControl.setCommand(3, stereoOnWithCD, stereo::off);
      
      





注:コマンドは、ラムダ式の一種として使用されます。 ラムダ式

Commandインターフェースのexecute()メソッドとCommandパラメーターにマップします。

ラム、それはsetCommand()メソッドに渡されます。



ラムダ式を使用してドライブコマンドをテストする



ラムダ式を使用してソース実装コードを簡素化するには

RemoteControl(キャンセルなし)、RemoteLoaderコードを変更し、特定のオブジェクトを置き換えます

コマンドラムダ式。 RemoteControlコンストラクターも変更する必要があります

NoCommandオブジェクトの代わりにラムダ式を使用します。 その後、次のことができます

ただし、特定のコマンドクラス(LightOnCommand、LightOffCommand、

HottubOnCommand、HottubOffCommandなど)。 以上です! 他のすべては同じままです。

彼。 誤ってコマンドインターフェイスを削除しないでください。 タイプマッチングに必要です

オブジェクトに格納されているラムダ式によって作成された関数オブジェクト

リモートコントロールおよびさまざまな方法に送信されます。



RemoteLoaderクラスの新しいコードは次のようになります。



 public class RemoteLoader { public static void main(String[] args) { RemoteControl remoteControl = new RemoteControl(); Light livingRoomLight = new Light("Living Room"); Light kitchenLight = new Light("Kitchen"); CeilingFan ceilingFan = new CeilingFan("Living Room"); GarageDoor garageDoor = new GarageDoor("Main house"); Stereo stereo = new Stereo("Living Room");       Command (   ).      (  22    9). remoteControl.setCommand(0, livingRoomLight::on, livingRoomLight::off); remoteControl.setCommand(1, kitchenLight::on, kitchenLight::off); remoteControl.setCommand(2, ceilingFan::high, ceilingFan::off); Command stereoOnWithCD = () -> { stereo.on(); stereo.setCD(); stereo.setVolume(11); }; remoteControl.setCommand(3, stereoOnWithCD, stereo::off); remoteControl.setCommand(4, garageDoor::up, garageDoor::down);      ,       ,   - ,     .(       -.       ;    —     -,     .) System.out.println(remoteControl); remoteControl.onButtonWasPushed(0); remoteControl.offButtonWasPushed(0); remoteControl.onButtonWasPushed(1); remoteControl.offButtonWasPushed(1); remoteControl.onButtonWasPushed(2); remoteControl.offButtonWasPushed(2); remoteControl.onButtonWasPushed(3); remoteControl.offButtonWasPushed(3);
      
      





また、忘れないでください。RemoteControlコンストラクターを変更し、NoCommandオブジェクト構築コードを削除して、ラムダ式に置き換える必要があります。



 public class RemoteControl { Command[] onCommands; Command[] offCommands; public RemoteControl() { onCommands = new Command[7]; offCommands = new Command[7]; for (int i = 0; i < 7; i++) { onCommands[i] = () -> { }; offCommands[i] = () -> { }; } } //   }
      
      





では、これらすべてのコマンドの結果をラムダ式で確認しましょう...



画像



»本の詳細については、出版社のウェブサイトをご覧ください

» コンテンツ

» 抜粋



ホーカーのクーポンが20%オフ-Head First



All Articles