Facadeモード


一、パターンプロフィール外観パターン(Facade Pattern)は一連の複雑なクラスを簡単な閉鎖インタフェースに包装することができる.フェースパターンとも呼ばれる.二、パターン意図facade(表面)モードの作用はクライアント操作とServer間の結合度を下げて、統一的なアクセス入口を提供してクライアントに使用させることである.底層変化がクライアント使用にもたらす不便を減らす.それは比較的固定的で実用的な操作に適用され、例えば病院に行って診察を受けるのは書留、外来診察、価格設定、化学検査、料金徴収、薬を取るなどに分けられる.これらの操作はすべて可能である.Facadeによって処理され、患者はFacadeと対話するだけでよい.Facadeでは、トランザクションの抽象化にすぎず、具体的なトランザクションロジックには関与しません.例えば、書留では、Facadeに書留が必要だと伝えるだけで、Facadeは具体的に書留を実現した看護婦に連絡し、看護婦が最終的に具体的な書留操作を実現します.三、モードUML(下図からhttp://www.dofactory.com/)四、モード参加者の顔(Facade)ロール:クライアントがこのロールを呼び出す方法.このロールは、関連する(1つ以上の)サブシステムの機能と責任を知っています.通常、このロールは、クライアントから送信されたすべてのリクエストを対応するサブシステムに委任します.サブシステム(SubSystem)ロール:1つ以上のサブシステムを同時に持つことができます.サブシステムの機能を実現し、Facadeオブジェクトによって割り当てられたタスクを処理する.各サブシステムは個別のクラスではなく、クラスの集合です.各サブシステムは、クライアントによって直接呼び出されたり、フェースロールによって呼び出されたりすることができます.サブシステムはゲートの存在を知らないが,サブシステムにとってゲートは別のクライアントにすぎない.五、サンプルコード1.サブシステムコード
public class Account {
	String firstName;
	String lastName;
	final String ACCOUNT_DATA_FILE = "AccountData.txt";
	
	
	public Account(String fname, String lname) {
	firstName = fname;
	lastName = lname;
	}
	public boolean isValid() {
		/*
		Let's go with simpler validation
		here to keep the example simpler.
		*/
		return false;
	}
	public boolean save() {
		String dataLine = getLastName() + "," + getFirstName();
		try {
			FileUtils.writeStringToFile(new File(ACCOUNT_DATA_FILE), dataLine);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
		return true;
	}
	public String getFirstName() {
		return firstName;
	}
	public String getLastName() {
		return lastName;
	}
}



public class Address {
	String address;
	String city;
	String state;
	final String ADDRESS_DATA_FILE = "Address.txt";
	
	public Address(String add, String cty, String st) {
		address = add;
		city = cty;
		state = st;
	}
	public boolean isValid() {
		/*
		The address validation algorithm
		could be complex in real-world
		applications.
		Let's go with simpler validation
		here to keep the example simpler.
		*/
		if (getState().trim().length() < 2)
			return false;
		return true;
	}
	public boolean save() {
		String dataLine = getAddress() + "," + getCity() + "," +
		getState();
		try {
			FileUtils.writeStringToFile(new File(ADDRESS_DATA_FILE), dataLine);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
		return true;
	}
	public String getAddress() {
		return address;
	}
	public String getCity() {
		return city;
	}
	public String getState() {
		return state;
	}
}


public class CreditCard {
	String cardType;
	String cardNumber;
	String cardExpDate;
	final String CC_DATA_FILE = "CC.txt";
	
	public CreditCard(String ccType, String ccNumber,
		String ccExpDate) {
		cardType = ccType;
		cardNumber = ccNumber;
		cardExpDate = ccExpDate;
	}
	public boolean isValid() {
		/*
		Let's go with simpler validation
		here to keep the example simpler.
		*/
		if (getCardType().equals(AccountManager.VISA)) {
			return (getCardNumber().trim().length() == 16);
		}
		if (getCardType().equals(AccountManager.DISCOVER)) {
			return (getCardNumber().trim().length() == 15);
		}
		if (getCardType().equals(AccountManager.MASTER)) {
			return (getCardNumber().trim().length() == 16);
		}
		return false;
	}
	public boolean save() {
		String dataLine =
		getCardType() + "," + getCardNumber() + "," +
		getCardExpDate();
		try {
			FileUtils.writeStringToFile(new File(CC_DATA_FILE), dataLine);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		}
		return true;
	}
	public String getCardType() {
		return cardType;
		}
		public String getCardNumber() {
		return cardNumber;
		}
		public String getCardExpDate() {
		return cardExpDate;
	}
}


2.Facadeコード
public class CustomerFacade {
	private String address;
	private String city;
	private String state;
	private String cardType;
	private String cardNumber;
	private String cardExpDate;
	private String fname;
	private String lname;
	
	public void setAddress(String inAddress) {
		address = inAddress;
	}
	public void setCity(String inCity) {
		city = inCity;
	}
	public void setState(String inState) {
		state = inState;
	}
	public void setFName(String inFName) {
		fname = inFName;
	}
	public void setLName(String inLName) {
		lname = inLName;
	}
	public void setCardType(String inCardType) {
		cardType = inCardType;
	}
	public void setCardNumber(String inCardNumber) {
		cardNumber = inCardNumber;
	}
	public void setCardExpDate(String inCardExpDate) {
		cardExpDate = inCardExpDate;
	}
	public boolean saveCustomerData() {
		Address objAddress;
		Account objAccount;
		CreditCard objCreditCard;
		/*
		client is transparent from the following
		set of subsystem related operations.
		*/
		boolean validData = true;
		String errorMessage = "";
		objAccount = new Account(fname, lname);
		if (objAccount.isValid() == false) {
			validData = false;
			errorMessage = "Invalid FirstName/LastName";
		}
		objAddress = new Address(address, city, state);
		if (objAddress.isValid() == false) {
			validData = false;
				errorMessage = "Invalid Address/City/State";
		}
		objCreditCard = new CreditCard(cardType, cardNumber,
		cardExpDate);
		if (objCreditCard.isValid() == false) {
			validData = false;
			errorMessage = "Invalid CreditCard Info";
		}
		if (!validData) {
			System.out.println(errorMessage);
			return false;
		}
		if (objAddress.save() && objAccount.save() && objCreditCard.save()) {
			return true;
		} else {
			return false;
		}
	}
}

3.クライアントコード
public class AccountManager extends JFrame {
	public static final String VISA = "VISA";
	public static final String MASTER = "MASTER";
	public static final String DISCOVER = "DISCOVER"; 
	public static final String newline = "
"; public static final String VALIDATE_SAVE = "Validate & Save"; private JComboBox cmbCardType; private JTextField txtFirstName = new JTextField(); private JTextField txtLastName = new JTextField(); private JTextField txtAddress = new JTextField(); private JTextField txtCity = new JTextField(); private JTextField txtState = new JTextField(); private JTextField txtCardNumber = new JTextField(); private JTextField txtDate = new JTextField(); private JButton submit = new JButton("submit"); private CustomerFacade customer; public AccountManager() { super(" Facade Pattern - Example "); cmbCardType = new JComboBox(); cmbCardType.addItem(AccountManager.VISA); cmbCardType.addItem(AccountManager.MASTER); cmbCardType.addItem(AccountManager.DISCOVER); submit.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub customer = new CustomerFacade(); if(txtFirstName.getText() != null || txtFirstName.getText() != ""){ customer.setFName(txtFirstName.getText()); } { // } customer.saveCustomerData(); } }); GridLayout layout = new GridLayout(9,2); setLayout(layout); add(new JLabel("txtFirstName")); add(txtFirstName); add(new JLabel("txtLastName")); add(txtLastName); add(new JLabel("txtAddress")); add(txtAddress); add(new JLabel("txtCity")); add(txtCity); add(new JLabel("cmbCardType")); add(cmbCardType); add(new JLabel("txtCardNumber")); add(txtCardNumber); add(new JLabel("txtDate")); add(txtDate); add(new JLabel()); add(submit); } public static void main(String[]args){ JFrame f = new AccountManager(); f.setBounds(100, 100, 600, 800); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setVisible(true); } }