当前位置: 首页 > news >正文

大话设计模式笔记(九)の外观模式

举个栗子

问题描述

股民炒股票

简单实现

股票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图

1340977-20190720143228307-1702123495.png

代码实现

基金类(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 与遗留代码交互所有复杂的工作

转载于:https://www.cnblogs.com/call-me-devil/p/11217645.html

相关文章:

  • sort(桶排序+hash)
  • P1306 斐波那契公约数(ksm+结论)
  • [Dxperience.8.*]报表预览控件PrintControl设置
  • “”(十六进制值 0x1D)是无效的字符
  • 每个开发人员现在应该下载的十种必备工具
  • 【海量视频】2013年上半年BPM厂商'K2'市场活动资料集锦
  • 2019牛客暑期多校训练营(第二场) - J - Go on Strike! - 前缀和预处理
  • OS的发展和分类
  • VBScript 内置函数
  • P1020 导弹拦截(nlogn求最长不下降子序列)
  • P1090 合并果子(哈弗曼树)
  • 推荐阅读链接
  • MySQL 5.7 zip 安装
  • P1004 方格取数(四维动态规划)
  • SCRUM Day 8
  • [译]Python中的类属性与实例属性的区别
  • 【刷算法】从上往下打印二叉树
  • 2019.2.20 c++ 知识梳理
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • CODING 缺陷管理功能正式开始公测
  • CSS 三角实现
  • golang 发送GET和POST示例
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • JavaScript HTML DOM
  • LintCode 31. partitionArray 数组划分
  • vue--为什么data属性必须是一个函数
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 复杂数据处理
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 记一次用 NodeJs 实现模拟登录的思路
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • #QT(串口助手-界面)
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (强烈推荐)移动端音视频从零到上手(上)
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (转)用.Net的File控件上传文件的解决方案
  • .net core 6 集成 elasticsearch 并 使用分词器
  • @NestedConfigurationProperty 注解用法
  • [ linux ] linux 命令英文全称及解释
  • [AndroidStudio]_[初级]_[修改虚拟设备镜像文件的存放位置]
  • [BeginCTF]真龙之力
  • [C语言][C++][时间复杂度详解分析]二分查找——杨氏矩阵查找数字详解!!!
  • [Deep Learning] 神经网络基础
  • [ExtJS5学习笔记]第三十节 sencha extjs 5表格gridpanel分组汇总
  • [GN] 后端接口已经写好 初次布局前端需要的操作(例)
  • [hdu 4552] 怪盗基德的挑战书
  • [JavaEE] 线程与进程的区别详解
  • [java面试]宇信易诚 广州分公司 java笔试题目回忆录
  • [LeetCode] Max Points on a Line
  • [MZ test.16]P1 评测
  • [NodeJS]NodeJS基于WebSocket的多用户点对点即时通讯聊天
  • [one_demo_4]不使用第3个变量交换两个变量的值