class CPU {
public void freeze() { ... }
public void jump(long position) { ... }
public void execute() { ... }
}
class Memory {
public void load(long position, byte[] data) {
...
}
}
class HardDrive {
public byte[] read(long lba, int size) {
...
}
}
为了更方便地操作它们,我们可以来创建一个外观类(facade):
class Computer {
public void startComputer() {
cpu.freeze();
memory.load(BOOT_ADDRESS, hardDrive.read(BOOT_SECTOR, SECTOR_SIZE));
cpu.jump(BOOT_ADDRESS);
cpu.execute();
}
}
然后我们的客户,就可以很方便地来这样调用了:
class You {
public static void main(String[] args) {
Computer facade = new Computer();
facade.startComputer();
}
}
interface SendMailInterface
{
public function setSendToEmailAddress($emailAddress);
public function setSubjectName($subject);
public function setTheEmailContents($body);
public function setTheHeaders($headers);
public function getTheHeaders();
public function getTheHeadersText();
public function sendTheEmailNow();
}
class SendMail implements SendMailInterface
{
public $to, $subject, $body;
public $headers = array();
public function setSendToEmailAddress($emailAddress)
{
$this->to = $emailAddress;
}
public function setSubjectName($subject)
{
$this->subject = $subject;
}
public function setTheEmailContents($body)
{
$this->body = $body;
}
public function setTheHeaders($headers)
{
$this->headers = $headers;
}
public function getTheHeaders()
{
return $this->headers;
}
public function getTheHeadersText()
{
$headers = "";
foreach ($this->getTheHeaders() as $header) {
$headers .= $header . "\r\n";
}
}
public function sendTheEmailNow()
{
mail($this->to, $this->subject, $this->body, $this->getTheHeadersText());
}
}
这个时候你又不好直接改源码,没办法,来一个facade吧
class SendMailFacade
{
private $sendMail;
public function __construct(SendMailInterface $sendMail)
{
$this->sendMail = $sendMail;
}
public function setTo($to)
{
$this->sendMail->setSendToEmailAddress($to);
return $this;
}
public function setSubject($subject)
{
$this->sendMail->setSubjectName($subject);
return $this;
}
public function setBody($body)
{
$this->sendMail->setTheEmailContents($body);
return $this;
}
public function setHeaders($headers)
{
$this->sendMail->setTheHeaders($headers);
return $this;
}
public function send()
{
$this->sendMail->sendTheEmailNow();
}
}
然后原来不加优化的终端调用可能是这样的:
$sendMail = new SendMail();
$sendMail->setSendToEmailAddress($to);
$sendMail->setSubjectName($subject);
$sendMail->setTheEmailContents($body);
$sendMail->setTheHeaders($headers);
$sendMail->sendTheEmailNow();
现在有了外观类,就可以这样了:
$sendMail = new SendMail();
$sendMailFacade = new sendMailFacade($sendMail);
$sendMailFacade->setTo($to)->setSubject($subject)->setBody($body)->setHeaders($headers)->send();
$shareObj = new shareFacade($twitterObj,$gooleObj,$redditObj);
$shareObj->share('//myBlog.com/post-awsome','My greatest post','Read my greatest post ever.');