外観モードfacade


生活の例:コンピューターを組み立てる、例えば組み立て会社があなたのニーズに合わせてコンピューターを組み立てる(CPUを売ったり、マザーボードを売ったりする必要がある)、ここの組み立て会社の役割は外観モードです.
分析はcpuなどの電子市場を1つのシステムと見なして、各部品を売るのはモジュールと見なして、需要は変わります:取引先はシステムの各モジュールを呼び出す必要があります、A、B、Cモジュール、取引先に対してもしA、B、Cモジュールの機能を知っていて、そして自分で組み立てて、とても面倒で、Facadeモードに引き込んで、取引先は各モジュールの機能を知る必要がなくて、外観のモードと付き合うだけでいいです.
解決すべき問題:レイヤコード生成モジュール、論理レイヤモジュール、データレイヤモジュール、構成管理モジュール(各モジュールがどのレイヤのコードを生成するか)、ユーザーがシステムを呼び出すモジュールを示します.
設計モードを使用しない実装は次のとおりです.
表示レイヤ:
package notusingmode;
/*
 *           
 */
public class Presetation {

	public void generate(){
		//1,               
		ConfigModel cm = ConfigManager.getInstance().getConfigData();
		
		if(cm.isNeedGenPresentation()){
			//2,            ,      
			System.out.println("           ");
		}
	}
}
package notusingmode;
//dao 
public class DAO {
	public void generate(){
		//1,               
		ConfigModel cm = ConfigManager.getInstance().getConfigData();
		
		if(cm.isNeedGenDAO()){
			//2,            ,      
			System.out.println("           ");
		}
	}
}
package notusingmode;
//   
public class Business {
	public void generate(){
		//1,               
		ConfigModel cm = ConfigManager.getInstance().getConfigData();
		
		if(cm.isNeedGenBusiness()){
			//2,            ,      
			System.out.println("           ");
		}
	}
}
package notusingmode;

/*
 *        ,         、       
 */
public class ConfigModel {

	private boolean needGenPresentation = true; //         
	private boolean needGenBusiness = true; //   
	private boolean needGenDAO = true;
	public boolean isNeedGenPresentation() {
		return needGenPresentation;
	}
	public void setNeedGenPresentation(boolean needGenPresentation) {
		this.needGenPresentation = needGenPresentation;
	}
	public boolean isNeedGenBusiness() {
		return needGenBusiness;
	}
	public void setNeedGenBusiness(boolean needGenBusiness) {
		this.needGenBusiness = needGenBusiness;
	}
	public boolean isNeedGenDAO() {
		return needGenDAO;
	}
	public void setNeedGenDAO(boolean needGenDAO) {
		this.needGenDAO = needGenDAO;
	}
	
	
} 
package notusingmode;

/*
 *        ,          ,          Model  ,      
 */
public class ConfigManager {

	private static ConfigManager manager = null;
	private static ConfigModel cm = null;

	private ConfigManager() {

	}

	public ConfigModel getConfigData() {
		return cm; //              ,             
	}

	public static ConfigManager getInstance() {
		if (manager == null) {
			manager = new ConfigManager();
			cm = new ConfigModel();
			//       ,     ConfigModel  ,     

		}
		return manager;
	}

}
package notusingmode;

public class Client {

	public static void main(String[] args) {

//        ,         ,     ,                ,      ,
//               ,         。---------》    
		
		new Presetation().generate();
		new Business().generate();
		new DAO().generate();
	}

}

インタフェースとインタフェース
インタフェース:ここではGUIインタフェースではなく、1つのコンポーネントの外部からこのコンポーネントを見ると、何が見えるか、つまりこのコンポーネントのインタフェースであり、外観は1つのクラスの外部から見ると、クラスのpublic方法はクラスの外観である.1つのモジュールの外部から見ると、モジュールが外部に提供するインタフェースはモジュールの外観である.
インタフェース:ここではjavaのinterfaceを特に指すのではなく、主に外部と内部のインタラクティブなチャネルを指し、通常はいくつかの方法を指します.提案された問題については、お客様に単純なインタフェースを定義するだけで、お客様はインタフェースを呼び出すだけで、他のことは外観に任せます.
Facadeはシステムの複数のモジュールを定義する外部の高度なインタフェースであり、通常は内部の複数のモジュールを呼び出す必要がある.
モジュール:本当に機能を実現しているので、各モジュールの間にインタラクションがあるかもしれませんが、各モジュールはfacadeを知らないことに注意してください.Facadeは各モジュールを知っています.
外観モード実装:A,B,Cモジュール,モジュールの実装とインタフェース,Facadeの定義
package facade;

public interface AModuleApi {

	public void testA();
}
package facade;

public class AModuleImpl implements AModuleApi {

	@Override
	public void testA() {
		System.out.println(" A    testA  ");
	}

}

B,Cのインタフェースは実装と類似しており,
package facade;
/*
 *     
 */
public class Facade {

	public void test(){
		//        ,             
		AModuleApi a = new AModuleImpl();
		a.testA();
		BModuleApi b = new BModuleImpl();
		b.testB();
		CModuleApi c = new CModuleImpl();
		c.testC();
	}
}
package facade;

public class Client {

	public static void main(String[] args) {

		new Facade().test();  //           ,        ,         
	}

}

外観モードを使用して、3つの実装の問題を解決します.
外観オブジェクトを1つ追加するだけです.
package facadeSolve;
/*
 *     
 */
public class Facade {

	public void generate(){
		//        ,             
		Presetation p = new Presetation();
		p.generate();
		Business b = new Business();
		b.generate();
		DAO dao = new DAO();
		dao.generate();
	}
}

クライアントはnew Facade()を呼び出す.generate(); すぐ
外観モードの目的は、外部でサブシステム機能をより簡単に使用できるようにすることです.外観モデルは、新しい実装を追加するのではなく、お客様のニーズを満たすために実装された機能をパッケージします.
Facadeはシステム側にあり、システムモジュールの機能を組み合わせて、外部に統一インタフェースを提供し、機能の共有を実現することができますが、外観を迂回したり、外観を使用せずにシステム内のモジュールを直接呼び出すこともできます.
1,facade実装:1つのサブシステムにとって、外観クラスは多くなく、通常、1つの外観インスタンスのみを保証する単一の例として実装することができる.直接外観の方法をstaticと書くこともでき、この実現は
外観クラスは、補助ツールクラスとして実装されます.
2,interfaceとして実現することができ、通常facadeは直接実現することをクラスと呼ぶが、facadeを真のinterfaceとして実現することもでき、システムの複雑さを増加させることができる.これはfacadeの実現が必要であり、また必要であるからである.
facadeインタフェースオブジェクトを取得するファクトリ.外観オブジェクトは、ユーザーに簡単なデフォルトの実装を提供します.
Facadeのメリットとデメリット:
ばらばら結合(クライアントとサブシステムの結合関係をばらばらにし、サブシステム内部のモジュールを拡張しやすくし、メンテナンスしやすい)
シンプルで使いやすい(外観クラスはクライアントがサブシステムを使用するためにワンストップサービスを提供する)
アクセスの階層をよりよく区別する(システム内部で使用する方法もあれば、外部で使用する方法もあり、外部に露出する必要がある機能を外部の視聴者に集中させることで、クライアントの使用を便利にするだけでなく、内部の詳細もよく隠すことができます)
しかし、あまりにも多くのfacadeは、facadeを呼び出すのがいいのか、モジュールを直接呼び出すのがいいのか迷っています.
本質:インタラクションをカプセル化し、呼び出しを簡素化