zoukankan      html  css  js  c++  java
  • 大话设计模式笔记(九)の外观模式

    举个栗子

    问题描述

    股民炒股票

    简单实现

    股票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 与遗留代码交互所有复杂的工作
  • 相关阅读:
    eclipse——插件报错:Could not find node.js
    常用css设置
    前端跨域常见的处理方法
    刷新建设批次为空的sql
    PostgreSQL 添加字段语句
    查询在A表有记录数据,B表没有记录数据的SQL
    postgreSql 备份复制表结构和数据 SQL语句
    删除site_planning_id 和version 重复的,如果有多个版本,留下版本号最高的
    leetcode 精选top面试题
    leetcode 精选top面试题
  • 原文地址:https://www.cnblogs.com/call-me-devil/p/11217645.html
Copyright © 2011-2022 走看看