大话设计模式笔记(九)の外观模式
程序员文章站
2023-11-04 12:32:10
举个栗子 问题描述 股民炒股票 简单实现 股票1 其他股票 测试 测试结果 外观模式 定义 为了子系统中的一组接口提供一个一致的界面,此模式定义了一个高层的接口,这个接口使得这个子系统更加容易使用。 UML图 代码实现 基金类(Facade) 测试 测试结果同上,此处省略。 总结 首先,在设计初期阶 ......
举个栗子
问题描述
股民炒股票
简单实现
股票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 与遗留代码交互所有复杂的工作。