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

【设计模式-3.1】结构型——外观模式

说明:本文介绍设计模式中结构型设计模式中的,外观模式;

亲手下厨还是点外卖?

外观模式属于结构型的设计模式,关注类或对象的组合,所呈现出来的结构。以吃饭为例,在介绍外观模式之前,通过这个例子,谈谈我对面向对象的理解。

吃饭,是一个功能,可以有两种方式来实现,对应的正是面向过程和面向对象的思想。

第一种,自己买菜买工具(初始化变量),做饭(实现方法),吃饭(实现方法),洗碗卖工具(释放内存空间);

第二种,点外卖(手机对象),做饭(店家对象),送外卖(外卖员对象),吃饭(顾客对象);

在这里插入图片描述

通过比较,就很容易理解两种设计思想了。实际上就是实现功能的思路,一种是将功能分为一步一步,逐步实现(面向过程);一种是将属性和行为封装为对象,让功能的实现在对象的交互中实现。

这两种解题思路,没有高低之分,也没有哪种更优秀,殊途同归。

外观模式

以上面吃饭为例,面向对象设计,如下:

(Vegetables,蔬菜对象,提供蔬菜)

/**
 * 蔬菜对象
 */
public class Vegetables {

    public void provide() {
        System.out.println("提供蔬菜");
    }
}

(Cook,厨师对象,做饭)

/**
 * 厨师
 */
public class Cook {

    public void cook() {
        System.out.println("做饭");
    }
}

(用餐者对象,吃饭,吃完饭洗碗)

/**
 * 食客
 */
public class Diners {

    public void eat() {
        System.out.println("吃饭");
    }

    public void wash() {
        System.out.println("洗碗");
    }
}

(Client,客户端,演示吃饭功能)

/**
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        new Vegetables().provide();
        new Cook().cook();
        new Diners().eat();
        new Diners().wash();
    }
}

(执行结果)

在这里插入图片描述

通过上面的例子,我们可以看出,实现一个功能涉及到多个对象的配合,那为什么我们不把这些对象中对应的功能(方法)绑定到一起,合并成一个业务层面上的功能(吃饭)呢?

如下:

(EatFacede,吃饭外观类,捆绑各个对象的方法,实现吃饭功能)

/**
 * 吃饭外观类
 */
public class EatFacede {

    /**
     * 蔬菜对象
     */
    private Vegetables vegetables;
    
    /**
     * 厨师对象
     */
    private Cook cook;
    
    /**
     * 食客对象
     */
    private Diners diners;

    public EatFacede() {
        vegetables = new Vegetables();
        cook = new Cook();
        diners = new Diners();
    }

    /**
     * 吃饭
     */
    public void eat() {
        vegetables.provide();
        cook.cook();
        diners.eat();
        diners.wash();
    }
}

(Client,客户端,演示吃饭流程,只需要调用吃饭外观类中的eat()方法即可)

/**
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        new EatFacede().eat();
    }
}

(执行结果)
在这里插入图片描述

以上就是结构型设计模式中,外观模式的内容。这种将繁多的对象方法合并到一起,实现一项“大功能”的思路与生活经验非常贴合。例如开公司,公司的合伙人一边有资金,一边有技术,聚在一起开公司干大事。

另外,在三层框架开发中,Controller层只管调用Service层中的一个方法,而在Service层中,该方法内可能去调用了其他Bean对象的方法,最终才实现了本Service中的这个功能,这也是外观模式的体现。

总结

本文参考《设计模式的艺术》、《秒懂设计模式》两书


http://www.kler.cn/news/161687.html

相关文章:

  • GO设计模式——5、建造者模式(创建型)
  • 深眸科技以机器视觉高性能优势,为消费电子行业提供优质解决方案
  • vuepress路径问题,导致图片不显示
  • 十一.图像处理与光学之图像缩放方式
  • Course2-Week3-使用机器学习的建议
  • 【开源】基于Vue.js的二手车交易系统
  • 力扣102. 二叉树的层序遍历
  • GO设计模式——14、代理模式(结构型)
  • 【深度学习】迁移学习中的领域转移及迁移学习的分类
  • 2024山东健博会,第六届济南国际大健康产业博览会5月举办
  • 1.PyTorch数据结构Tensor常用操作
  • ChatGPT/GPT4科研实践篇: AI绘图+论文写作+编程
  • ChatGPT学习笔记
  • yolov5 获取漏检图片脚本
  • 【Java】图论笔记
  • 2023-12-03 C语言最小二乘法备忘
  • 零基础自学C语言|深入理解指针 ④
  • 2002-2021年全国各地级市环境规制18个相关指标数据
  • vue项目中如何引入zip压缩包之解决方案
  • html和css写去哪儿导航条
  • CefSharp 获取POST(AJAX)、GET消息返回值(request)
  • “低代码开发:快餐大厨还是魔术棒?探寻软件开发的诙谐世界“
  • ZooKeeper学习一
  • Verilog学习 | 用initial语句写出固定的波形
  • 《使用ThinkPHP6开发项目》 - 安装ThinkPHP框架
  • Amazon CodeWhisperer 正式发布可免费供个人使用
  • 【Flink系列五】Checkpoint及Barrier原理
  • CCF刷题记录 -- 202305-2:矩阵运算 --python解法
  • 【每日一题】—— D. Divide and Equalize(Codeforces Round 903 (Div. 3))(数学、数论)
  • 12.07