专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

不爬山,不拍照!《设计模式入门到入坑》第一课

作者爱说话

今天是刚好来杭州的第二周,也是一个惬意的周五,很巧也是我的生日,未来的工作可能会很忙,还是会继续坚持 sharing (本来昨天发的,但是还想完善完善就又拖了一天,哈哈。奥利给)

124_1.png

力求通过诙谐的形式讲解各种设计模式的巧妙之处,带你设计模式从入门到入坑,做到别人加班,你加薪! Go

外观模式引入

王经理:上课啦!林步动和郝美丽到了没?

小林:到了,经理。

小美:我在这,经理。

王经理:好,那我们来上课,今天我们来讲一种类型为结构型的设计模式,就是外观模式,外观模式也叫做门面模式,从字面上理解就是,就是对外提供了一个统一的接口,用来访问子系统中的一群接口,通过这个高层的接口,让这个子系统更容易被调用 124_2.png

小美:噢,经理你的意思是不是,外观模式就是适用于那种子系统越来越复杂的情况,我们可以增加外观模式使调用变的更简单,还可以减少系统依赖,松散耦合

王经理:对,小美你理解的非常到位。

小林摸了摸头:经理,我还是不太清楚。

王经理:林步动,就知道你不懂,接下来,我们来 Coding 深入理解一下。

  • 打开你的 idea 和经理一起 Coding 吧!

外观模式 Coding

王经理:假设,我们现在需要维护一个积分兑换礼物系统

124_3.png Leetcode – 算法题你值得拥有

因为我们主讲设计模式,所以简化业务过程,假设一个用户想要兑换物品,我们得有一个物品对象,需要经过这几个步骤,校验积分、库存 -> 支付积分 -> 发货交付单号

  • ok,你的 idea 打开了么?来吧,Coding

设计一个物品对象,就一个简单的礼物名字就好了,记得 Alt + Insert 为这个对象加入 get/set/toString/构造等方法

public class Gift {
    private String name;

    public Gift(String name) {
        this.name = name;
 } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Gift{" + "name='" + name + '\'' + '}'; } } 

非常好,接下来设计一下 校验积分、库存的 Service? 为了简单,我们直接传入 Gift ,然后直接输出校验通过,return true

public class CheckService {
    public Boolean isAvaliable(Gift gift) {
        System.out.println("校验" + gift.getName() + "积分,库存通过");
        return true;
    }
} 

接下来,支付积分的 Service 是不是也是信手拈来,我们直接传入 Gift ,然后直接输出支付成功,return true

public class PayService {
    public Boolean pay(Gift gift) {
        System.out.println("支付" + gift.getName() + "成功");
        return true;
    }
} 

ok,校验支付都通过,发货吧,老套路,传入 Gift,生成一个你喜欢的单号(就是这么随意),记得return单号 回去

public class ShippingService {
    public String shipGift(Gift gift) {
        System.out.println("正在运输" + gift.getName());
        String shippingOrderNo = "666";
        return shippingOrderNo;
 } } 

这么多子系统,你是不是很烦?所以外观模式的作用就体现出来了,我们可以来做一个统一的 GiftService 去调用这些子系统。

public class GiftService {

    /**
     * 因为我们没有注入 Spring 环境,所以这里直接写个构造方法
 */
 private final PayService pointsPaymentService = new PayService(); private final CheckService checkService = new CheckService(); private final ShippingService shippingService = new ShippingService(); public void giftExchange(Gift gift) { // 校验积分、库存 if (checkService.isAvaliable(gift)) { // 支付积分 if (pointsPaymentService.pay(gift)) { // 获得单号 String orderNo = shippingService.shipGift(gift); System.out.println("物流已经发出,订单号是 " + orderNo); } } } } 

一切都是如此的完美,赶快来写一个 Test 类测试一下吧。

public class Test {
    public static void main(String[] args) {
//      生成一个礼物对象
        Gift gift = new Gift(" iphone999 ");
// 没有 Spring 环境,直接 new GiftService. 如果在 Spring 环境中,直接注入 GiftService 就可以调用啦
 GiftService giftService = new GiftService(); // 调用统一的接口 giftService.giftExchange(gift); } } 

run 一下?

124_4.png

发现,很完美的输出了我们预计想实现的效果,这个 iphone 999 成功的被发出了。

外观模式运用

王经理:接下来,我们看下外观模式在框架中的运用,大家的 idea 双击 shift ,搜索一下位于org.springframework.jdbc.support包中的 JdbcUtils 类(该类主要供内部使用的JDBC的通用方法)

124_5.png

JdbcUtils 类中的 closeConnection、closeStatement、closeResultSet、extractDatabaseMetaData 等方法就是外观类提供的调用子类的接口。

林步动,就你没开 idea,来,看大屏幕

public static void closeConnection(@Nullable Connection con) {
    if (con != null) {
        try {
            con.close();
        } catch (SQLException ex) {
 logger.debug("Could not close JDBC Connection", ex); } catch (Throwable ex) { // We don't trust the JDBC driver: It might throw RuntimeException or Error. logger.debug("Unexpected exception on closing JDBC Connection", ex); } } } 

我们拿 closeConnection 方法来举例,该方法的的入参 Connection 类位于 java.sql 包下,通过外观类的包装,客户端直接调外观类进行相应操作接口不需要直接调 java.sql 包下的子类。巧不巧,妙不妙,鼓掌~

#

外观模式总结

小林:经理,外观模式是好巧妙啊,简化了好多的调用过程,我都不用了解深入子系统了,这么好的设计模式有缺点吗?

经理:你小子,总算问道点上了,再好的设计模式都会有缺点,外观模式的缺点在于增加子系统,扩展子系统行为容易引入风险,不符合开闭原则

经理:今天的课都听懂了吗?那留个问题给大家,听完这一课,你工作或者学习中有没有可以用外观模式优化的地方?外观模式你还能想到在其他的框架中的运用吗?

本节课代码地址: https://github.com/isysc1/desgin


124_6.png

文章永久链接:https://tech.souyunku.com/29268

未经允许不得转载:搜云库技术团队 » 不爬山,不拍照!《设计模式入门到入坑》第一课

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们