外观模式:为子系统的一组接口提供一个一致的界面,此模式定义了一个高层接口,使得这个子系统更加容易使用
优点:知道哪些子系统类负责处理请求,并将请求代理给合适的子系统对象,降低用户操作与子系统类的耦合
实现:散户炒股,很容易亏钱,因为需要学习的专业知识太多了,面对市场上成千上万的股票,不知道如何选择,这时候有一个相对保险的方案:买基金。基金的经理人,拥有专业的证券知识,了解各个股市的行情,他把散户的资金集中起来,去投资不同的股票。其实这就运用到了外观模式,散户炒股,需要了解各式各样的股票,这就意味着跟股票类的耦合度过高,而买基金,用户只需要了解基金类,而基金类去跟各式各样的股票类打交道,这就降低了耦合度。
1、股票类
/**
* 股票一
*/
public class StockOne {
public void buy(){
System.out.println("股票一买入");
}
public void sell(){
System.out.println("股票一卖出");
}
}
/**
* 股票二
*/
public class StockTwo {
public void buy(){
System.out.println("股票二买入");
}
public void sell(){
System.out.println("股票二卖出");
}
}
/**
* 股票三
*/
public class StockThree {
public void buy(){
System.out.println("股票三买入");
}
public void sell(){
System.out.println("股票三卖出");
}
}
2、基金类
/**
* 基金类(外观类)
*/
public class Fund {
StockOne stockOne;
StockTwo stockTwo;
StockThree stockThree;
public Fund(){
stockOne = new StockOne();
stockTwo = new StockTwo();
stockThree = new StockThree();
}
/**
* 买入
*/
public void buy(){
stockOne.buy();
stockTwo.buy();
stockThree.buy();
}
/**
* 卖出
*/
public void sell(){
stockOne.sell();
stockTwo.sell();
stockThree.sell();
}
}
3、测试类
/**
* 测试外观模式
*/
public class TestFacade {
public static void main(String [] args){
Fund fund = new Fund();
fund.buy();
fund.sell();
}
}
测试结果:
很多人可能没有了解过外观模式,但是在开发很多时候会使用到它,是非常常用的设计模式之一。
外观模式通常的使用场景:
1、在设计初期,需要有意识的将不同的层分离,比如经典的三层架构,层与层直接建立外观facade
2、在开发阶段,子系统会因为不断的重构演化而变得越来越复杂,增加外观facade可以提供一个简单的接口,减少类之间的依赖
3、在维护大型遗留系统时,可能这个系统已经很难维护和拓展了,但是又有非常重要的功能,新开发必须依赖它,这时候就可以用到外观模式,提供一个比较清晰的接口,新系统与facade交互,facade与遗留代码进行复杂交互