外观模式Facade,为子系统的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
例子:炒股
投资者可能面对多种股票
package Facade;
public class Stock1 {
public void sell(){
System.out.println("股票1卖出");
}
public void buy(){
System.out.println("股票1买入");
}
}
package Facade;
public class Stock2 {
public void sell(){
System.out.println("股票2卖出");
}
public void buy(){
System.out.println("股票2买入");
}
}
package Facade;
public class Stock3 {
public void sell(){
System.out.println("股票3卖出");
}
public void buy(){
System.out.println("股票3买入");
}
}
package Facade;
public class realty {
public void sell(){
System.out.println("房地产卖出");
}
public void buy(){
System.out.println("房地产买入");
}
}
package Facade;
public class nationalDebt {
public void sell(){
System.out.println("国债卖出");
}
public void buy(){
System.out.println("国债买入");
}
}
增加一个基金类,它需要了解所有的股票或其他投资方法的方法或者属性,进行组合,以备外界调用。
package Facade;
public class Fund {
Stock1 gu1;
Stock2 gu2;
Stock3 gu3;
nationalDebt nd;
realty rt;
public Fund(){
gu1=new Stock1();
gu2=new Stock2();
gu3=new Stock3();
nd=new nationalDebt();
rt=new realty();
}
public void buyFund(){
gu1.buy();
gu2.buy();
gu3.buy();
nd.buy();
rt.buy();
}
public void sellFund(){
gu1.sell();
gu2.sell();
gu3.sell();
nd.sell();
rt.sell();
}
}
客户端去调用,此时用户不需要了解股票,甚至可以对股票一无所知,参与股票的具体买卖都由基金公司完成
package Facade;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Fund jijin=new Fund();
jijin.buyFund();
jijin.sellFund();
}
}
Facade方法实现中,一般是负责把客户端的请求转发给子系统内部的各个模块进行处理,Facade的方法本身并不进行功能的处理,只是实现一个功能的组合调用。
优点:
1.松散耦合,外观模式送伞了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护
2.简单易用,外观模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟外观交互就可以了,相当于外观类为外部客户端使用子系统提供了一站式服务
3.更好的划分访问层次,有些方法是对系统外的,有些方法是系统内部使用的,把需要保留给外部的功能集中到外观中,这样既方便客户端使用,也很好的隐藏了内部的细节
针对上述优点,何时选用外观模式?
1.希望为一个复杂的子系统提供一个简单接口,使用外观对象实现大部分客户需要的功能,从而简化客户的使用
2.想让客户程序和抽象类的实现部分松散耦合,使用外观对象将这个子系统与它的客户分离开,从而提高子系统的独立性和可移植性
3.如果构建多层结构的系统,可以考虑使用外观模式,使用外观对象作为每层的入口,既可以简化层间调用,也可以松散层次之间的依赖关系
参考:
《大话设计模式》
https://my.oschina.net/xianggao/blog/615213