ファサードモードは外観モードとも呼ばれます
1. アピアランスモードとは何ですか?
ファサード パターンは、サブシステム内のインターフェイスのグループにアクセスするための統一インターフェイスをクライアントに提供します。外観モードを使用すると、次のような利点があります。
(1) 使いやすさ: サブシステムが使いやすくなります。クライアントは、サブシステムの内部実装を理解する必要も、サブシステムの多くの内部モジュールと対話する必要もなくなり、サブシステムと対話するだけで済みます。外観クラス。
(2) 疎結合: クライアントをサブシステムから分離し、サブシステム内のモジュールの拡張と保守を容易にします。
(3) アクセス レベルのより適切な分割: Facade を合理的に使用することで、アクセス レベルをより適切に分割できます。一部のメソッドはシステムの外部で使用され、一部のメソッドはシステム内部で使用されます。外部に露出する必要がある機能をファサードに集中させることで、クライアントが使いやすいだけでなく、内部の詳細をうまく隠すことができます。
ただし、出現パターンがサブシステムのクラスに制約を課しすぎると、多様性や柔軟性が低下するため、複雑なサブシステムにシンプルなインターフェースを提供したり、システムの使いやすさを向上させたり、出現パターンを導入したりするのに適しています。パターンをサブシステムに適用し、クライアントから切り離して、サブシステムの独立性と移植性を向上させます。
上図に示すように、アピアランスモードの導入により、サブシステムの利用がより簡単になり、お客様はFacedeアピアランスロールを扱うだけで済みます。サブシステム間の複雑な関係は、Facedeロールによって実現され、サブシステム間の結合が軽減されます。システム。Facade クラスが存在しない場合、サブシステムは相互に参照を保持することになり、重大な依存関係が発生します。1 つのクラスを変更すると、他のクラスの変更が連鎖する可能性がありますが、Facade クラスを使用すると、サブシステム間の関係は Facade クラス内に配置されます。 、デカップリングの役割を果たします。
2. UML構造図
- ファサード ファサード ロール: クライアントは、関連するサブシステムの機能を認識しているこのロールのメソッドを呼び出すことができます。通常の状況では、このロールはクライアントから送信されたすべてのリクエストを対応するサブシステムに委任します。
- SubSystem サブシステムの役割: 同時に 1 つ以上のサブシステムが存在できます。各サブシステムは個別のクラスではなく、クラスのコレクションです (たとえば、上記のサブシステムは、SubSystemA、SubSystemB、SubSystemC、および SubSystemD という複数のクラスで構成されています)。各サブシステムは、クライアントまたはファサード ロールによって直接呼び出すことができます。サブシステムはファサードの存在を知りません。サブシステムにとって、ファサードの役割は単なるクライアントの 1 つです。
3. コードの実装
コンピュータの起動プロセスを例に挙げてみましょう。
まず実装クラスを見てみましょう。
public class CPU {
public void startup(){
System.out.println("cpu startup!");
}
public void shutdown(){
System.out.println("cpu shutdown!");
}
}
public class Memory {
public void startup(){
System.out.println("memory startup!");
}
public void shutdown(){
System.out.println("memory shutdown!");
}
}
public class Disk {
public void startup(){
System.out.println("disk startup!");
}
public void shutdown(){
System.out.println("disk shutdown!");
}
}
//Facade类
public class Computer {
private CPU cpu;
private Memory memory;
private Disk disk;
public Computer(){
cpu = new CPU();
memory = new Memory();
disk = new Disk();
}
public void startup(){
System.out.println("start the computer!");
cpu.startup();
memory.startup();
disk.startup();
System.out.println("start computer finished!");
}
public void shutdown(){
System.out.println("begin to close the computer!");
cpu.shutdown();
memory.shutdown();
disk.shutdown();
System.out.println("computer closed!");
}
}
ユーザークラスは次のとおりです。
public class User {
public static void main(String[] args) {
Computer computer = new Computer();
computer.startup();
computer.shutdown();
}
}
操作結果:
コンピューターを起動してください!
CPU起動!
メモリ起動!
ディスク起動!
パソコンの起動は完了です!
コンピューターを閉じ始めます!
CPUシャットダウン!
メモリシャットダウン!
ディスクがシャットダウンされました!
コンピューターが閉じられました!
Facade クラスは、実際には CPU、ディスク、およびメモリ モジュールの外観インターフェイスに相当します。この Facade クラスを使用すると、クライアントはサブシステム内の CPU、ディスク、およびメモリ モジュールを個人的に呼び出す必要も、システムの内部実装の詳細を知っているため、CPU、ディスク、およびメモリ モジュールの存在を知る必要さえありません。クライアントは Facade クラスと対話するだけでよいため、CPU の分離をより適切に実現できます。クライアントおよびサブシステムのディスクおよびメモリ モジュールにより、お客様はシステムをより簡単に使用できるようになります。
4. その他の問題
1. システムにはいくつの外観クラスを含めることができますか?
外観パターンでは、通常、必要な外観クラスは 1 つだけであり、この外観クラスにはシングルトン クラスであるインスタンスが 1 つだけあります。ただし、これはシステム全体に外観クラスが 1 つだけあるという意味ではなく、サブシステムごとに外観クラスが 1 つだけあるということだけを意味します。つまり、システムに複数のサブシステムがある場合、各サブシステムには外観クラスがあり、システム全体が複数の外観クラスを持つことができます。
2. 新しい動作をサブシステムに追加できますか?
出現パターンの目的は、サブシステムに集中化され簡素化された通信チャネルを提供することですが、サブシステムに新しい動作を追加することではありません。例えば、病院の受付スタッフは医療従事者ではありませんし、受付スタッフが患者に医療サービスを提供することはできません。