外观模式以及动机
外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
动机:组件的客户和组件中各种复杂的子系统有了过多的耦合,随着外部客户程序和各子系统的演化,这种过度的耦合面临很多变化的变化的挑战
问题的引入:病人与医院
如果把医院作为一个子系统,按照部门职能,这个系统可以划分为挂号、门诊、划价、化验、收费、取药等,看病的病人要与这些部门打交道,就如同一个子系统客户端与另一个子系统的各个类打交道一样,不是一件容易的事。
可以设置一个接待员的位置,由接待员负责代为挂号、门诊、划价、化验、收费、取药等,这个接待员就是门面模式的体现。
问题的引入:投资者买股票vs基金
由于众多投资者对众多股票的联系太多,反而不利于操作,这在软件中称为耦合性过高,而有了基金以后,变成众多用户只和基金打交道,关心基金的上涨和下跌就可以了,实际上的操作却是,基金经理人在与上千只股票和其他资投资产品打交道。
股民炒股代码
具体股票、国债、房地产类
public class Stock1_1 {
public void Sell() {
System.out.println("股票1卖出");
}
public void Buy() {
System.out.println("股票1 买入");
}
}
//Stock2、Stock3、NationalDebt1(国债)、Realty1(房地产)类代码类似
客户端代码
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
//一
Stock1_1 gu1=new Stock1_1();
Stock2_1 gu2=new Stock2_1();
Stock3_1 gu3=new Stock3_1();
NationalDebt1_1 nd1=new NationalDebt1_1();
Realty1_1 rt1=new Realty1_1();
gu1.Buy();
gu2.Buy();
gu3.Buy();
nd1.Buy();
rt1.Buy();
gu1.Sell();
//以下类似
}
}
投资基金代码
代码结构图
基金类(加入到股民炒股中)
public class Fund_2 {
Stock1_1 gu1;
Stock2_1 gu2;
Stock3_1 gu3;
NationalDebt1_1 nd1;
Realty1_1 rt1;
public Fund_2() {
this.gu1 = new Stock1_1();
this.gu2 = new Stock2_1();
this.gu3 = new Stock3_1();
this.nd1 = new NationalDebt1_1();
this.rt1 = new Realty1_1();
}
public void BuyFund() {
gu1.Buy();
gu2.Buy();
// 以下类似
}
public void SellFund() {
gu1.Sell();
gu2.Sell();
// 以下类似
}
}
客户端
public class Main {
public static void main(String[] args) {
// TODO 自动生成的方法存根
//二
Fund_2 jijin=new Fund_2();
//基金购买
jijin.BuyFund();
//基金赎回
jijin.SellFund();
}
}
何时使用外观模式
三阶段:
首先,在设计初期阶段,应该要有意识的,将不同的两个层分离
其次,在开发阶段,子系统往往因为不断地重构演化而变得越来越复杂,增加外观Facade可以提供一个简单的接口,减少他们这样的一个阶段。
第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,,可以为新系统开发一个外观Facade类来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作