欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 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 与遗留代码交互所有复杂的工作