大话设计模式笔记(九)の外观模式
举个栗子
问题描述
股民炒股票
简单实现
股票1
/**
* 股票1
* Created by callmeDevil on 2019/7/20.
*/
public class Stock1 {
public void sell() {
System.out.println("股票1卖出");
}
public void buy() {
System.out.println("股票1买入");
}
}
其他股票
/**
* 股票2
* Created by callmeDevil on 2019/7/20.
*/
public class Stock2 {
// 代码与股票1类似
}
/**
* 股票3
* Created by callmeDevil on 2019/7/20.
*/
public class Stock3 {
// 代码与股票1类似
}
/**
* 国债1
* Created by callmeDevil on 2019/7/20.
*/
public class NationalDebt1 {
// 代码与股票1类似
}
/**
* 房地产1
* Created by callmeDevil on 2019/7/20.
*/
public class Realty1 {
// 代码与股票1类似
}
测试
/**
* 炒股测试
* Created by callmeDevil on 2019/7/20.
*/
public class Test {
public static void main(String[] args) {
Stock1 stock1 = new Stock1();
Stock2 stock2 = new Stock2();
Stock3 stock3 = new Stock3();
NationalDebt1 debt1 = new NationalDebt1();
Realty1 realty1 = new Realty1();
// 用户需要了解股票、国债、房地产情况,需要参与这些项目的具体买卖,耦合性很高
stock1.buy();
stock2.buy();
stock3.buy();
debt1.buy();
realty1.buy();
stock1.sell();
stock2.sell();
stock3.sell();
debt1.sell();
realty1.sell();
}
}
测试结果
股票1买入
股票2买入
股票3买入
国债1买入
房地产1买入
股票1卖出
股票2卖出
股票3卖出
国债1卖出
房地产1卖出
外观模式
定义
为了子系统中的一组接口提供一个一致的界面,此模式定义了一个高层的接口,这个接口使得这个子系统更加容易使用。
UML图
代码实现
基金类(Facade)
/**
* 基金类(Facade)
* Created by callmeDevil on 2019/7/20.
*/
public class Fund {
private Stock1 stock1;
private Stock2 stock2;
private Stock3 stock3;
private NationalDebt1 debt1;
private Realty1 realty1;
public Fund(){
stock1 = new Stock1();
stock2 = new Stock2();
stock3 = new Stock3();
debt1 = new NationalDebt1();
realty1 = new Realty1();
}
// 买基金
public void buyFund(){
stock1.buy();
stock2.buy();
stock3.buy();
debt1.buy();
realty1.buy();
}
// 卖基金
public void sellFund(){
stock1.sell();
stock2.sell();
stock3.sell();
debt1.sell();
realty1.sell();
}
}
测试
/**
* 基金测试(外观模式)
* Created by callmeDevil on 2019/7/20.
*/
public class Test {
public static void main(String[] args) {
// 此时用户不需要了解股票,甚至可以对股票一无所知,买了基金就回家睡觉
// 一段时间后再赎回就可以大把数钱,参与股票的具体买卖都有基金公司完成
// 客户端代码非常简洁明了
Fund fund = new Fund();
// 购买基金
fund.buyFund();
// 基金赎回
fund.sellFund();
}
}
测试结果同上,此处省略。
总结
- 首先,在设计初期阶段,应该要有意识的将不同的两个层分离,层与层之间建立外观 Facade;
- 其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,增加外观 Facade 可以提供一个简单的接口,减少它们之间的依赖;
- 第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,为新系统开发一个外观 Facade 类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与 Facade 对象交互,Facade 与遗留代码交互所有复杂的工作。
Pass:以上纯属个人理解~~如果发现有错或是心存建议意见等,欢迎大家评论或联系~(# ゚Д゚)~祝大家身体健康学习进步工作顺利生活愉快!
版权归 callmeDevil 所有,如需转载请标注转载来源