大话设计模式笔记(九)の外观模式
举个栗子
问题描述
股民炒股票
简单实现
股票1
1. /**
2. * 股票1
3. * Created by callmeDevil on 2019/7/20.
4. */
5. public class Stock1 {
6.
7. public void sell() {
8. System.out.println("股票1卖出");
9. }
10.
11. public void buy() {
12. System.out.println("股票1买入");
13. }
14.
15. }
16.
其他股票
1. /**
2. * 股票2
3. * Created by callmeDevil on 2019/7/20.
4. */
5. public class Stock2 {
6. // 代码与股票1类似
7. }
8.
9.
10. /**
11. * 股票3
12. * Created by callmeDevil on 2019/7/20.
13. */
14. public class Stock3 {
15. // 代码与股票1类似
16. }
17.
18.
19. /**
20. * 国债1
21. * Created by callmeDevil on 2019/7/20.
22. */
23. public class NationalDebt1 {
24. // 代码与股票1类似
25. }
26.
27.
28. /**
29. * 房地产1
30. * Created by callmeDevil on 2019/7/20.
31. */
32. public class Realty1 {
33. // 代码与股票1类似
34. }
35.
测试
1. /**
2. * 炒股测试
3. * Created by callmeDevil on 2019/7/20.
4. */
5. public class Test {
6.
7. public static void main(String[] args) {
8. Stock1 stock1 = new Stock1();
9. Stock2 stock2 = new Stock2();
10. Stock3 stock3 = new Stock3();
11. NationalDebt1 debt1 = new NationalDebt1();
12. Realty1 realty1 = new Realty1();
13.
14. // 用户需要了解股票、国债、房地产情况,需要参与这些项目的具体买卖,耦合性很高
15. stock1.buy();
16. stock2.buy();
17. stock3.buy();
18. debt1.buy();
19. realty1.buy();
20.
21. stock1.sell();
22. stock2.sell();
23. stock3.sell();
24. debt1.sell();
25. realty1.sell();
26. }
27.
28. }
29.
测试结果
1. 股票1买入
2. 股票2买入
3. 股票3买入
4. 国债1买入
5. 房地产1买入
6. 股票1卖出
7. 股票2卖出
8. 股票3卖出
9. 国债1卖出
10. 房地产1卖出
11.
外观模式
定义
为了子系统中的一组接口提供一个一致的界面,此模式定义了一个高层的接口,这个接口使得这个子系统更加容易使用。
UML图
代码实现
基金类(Facade)
1. /**
2. * 基金类(Facade)
3. * Created by callmeDevil on 2019/7/20.
4. */
5. public class Fund {
6.
7. private Stock1 stock1;
8. private Stock2 stock2;
9. private Stock3 stock3;
10. private NationalDebt1 debt1;
11. private Realty1 realty1;
12.
13. public Fund(){
14. stock1 = new Stock1();
15. stock2 = new Stock2();
16. stock3 = new Stock3();
17. debt1 = new NationalDebt1();
18. realty1 = new Realty1();
19. }
20.
21. // 买基金
22. public void buyFund(){
23. stock1.buy();
24. stock2.buy();
25. stock3.buy();
26. debt1.buy();
27. realty1.buy();
28. }
29.
30. // 卖基金
31. public void sellFund(){
32. stock1.sell();
33. stock2.sell();
34. stock3.sell();
35. debt1.sell();
36. realty1.sell();
37. }
38.
39. }
40.
测试
1. /**
2. * 基金测试(外观模式)
3. * Created by callmeDevil on 2019/7/20.
4. */
5. public class Test {
6.
7. public static void main(String[] args) {
8. // 此时用户不需要了解股票,甚至可以对股票一无所知,买了基金就回家睡觉
9. // 一段时间后再赎回就可以大把数钱,参与股票的具体买卖都有基金公司完成
10. // 客户端代码非常简洁明了
11. Fund fund = new Fund();
12. // 购买基金
13. fund.buyFund();
14. // 基金赎回
15. fund.sellFund();
16. }
17.
18. }
19.
测试结果同上,此处省略。
总结
- 首先,在设计初期阶段,应该要有意识的将不同的两个层分离,层与层之间建立外观 Facade;
- 其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,增加外观 Facade 可以提供一个简单的接口,减少它们之间的依赖;
- 第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,为新系统开发一个外观 Facade 类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与 Facade 对象交互,Facade 与遗留代码交互所有复杂的工作。
Pass:以上纯属个人理解~~如果发现有错或是心存建议意见等,欢迎大家评论或联系~(# ゚Д゚)~祝大家身体健康学习进步工作顺利生活愉快!
版权归 callmeDevil 所有,如需转载请标注转载来源
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥