【学习笔记】设计模式-门面/外观模式(Facade)

0 设计模式

不了解设计模式的小伙伴可以通过这篇文章了解一下什么是设计模式

https://blog.csdn.net/qq_42874315/article/details/120006447?spm=1001.2014.3001.5502

1 门面/外观模式

在没有门面的时候,我们和别的事物之间是一对多的关系,任何一件事情都必须自己去亲历亲为,用现实中的例子就是去政府部门办理各种业务,在没有门面之前,我们需要自己在各个部门之间去跑,非常的耗时耗力;有了门面之后我和别的事物之间就是一对一的关系了,现实中的例子就是政府部门专门派出了接待人员,我们告诉接待人员我们想办什么业务,接待人员帮助我们在各部门之间沟通,这时我们就只需要面向接待人员去办理业务了,此时的接待人员可以理解为门面

没有门面前
在这里插入图片描述

有了门面后

在这里插入图片描述

2 实现思路

在这里插入图片描述

创建一个 Shape 接口和实现了 Shape 接口的实体类。下一步是定义一个外观类 ShapeFacade。

ShapeFacade 类使用实体类来代表用户对这些类的调用。Test 类使用 ShapeFacade 类来显示结果。

3 需要的类

  1. 将被代理的事物们抽象成一个接口
  2. 被代理的具体事物(实现接口)
  3. 门面(提供给用户访问)
    1. 门面中需要聚合被代理的具体事物
    2. 在无参构造中,需要给聚合的事物赋值(new相应事物的无参构造)
    3. 分别提供对应具体事物的方法
  4. 测试类(调用门面去实际操作上述的事物)

4 具体实现

4.1 Shape接口

/**
 * @Author ChenJiahao(程序员五条)
 * @Date 2021/8/16 22:02
 */
public interface Shape {
    void draw();
}

4.2 Shape接口的实现类

4.2.1 Circle

/**
 * @Author ChenJiahao(程序员五条)
 * @Date 2021/8/16 22:02
 */
public class Circle implements Shape{
    @Override
    public void draw() {
        System.out.println("画个圆:Circle.draw()");
    }
}

4.2.2 Rectangle

/**
 * @Author ChenJiahao(程序员五条)
 * @Date 2021/8/16 22:03
 */
public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("画个长方形:Rectangle.draw()");
    }
}

4.2.3 Square

/**
 * @Author ChenJiahao(程序员五条)
 * @Date 2021/8/16 22:03
 */
public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("画个正方形:Square.draw()");
    }
}

4.3 Shape的门面类

/**
 * 管理Shape的门面
 * @Author ChenJiahao(程序员五条)
 * @Date 2021/8/16 22:04
 */
public class ShapeFacade {
    private Shape circle;
    private Shape rectangle;
    private Shape square;

    public ShapeFacade() {
        circle = new Circle();
        rectangle = new Rectangle();
        square = new Square();
    }

    public void drawCircle(){
        circle.draw();
    }

    public void drawRectangle(){
        rectangle.draw();
    }

    public void drawSquare(){
        square.draw();
    }

}

4.4 测试类

/**
 * @Author ChenJiahao(程序员五条)
 * @Date 2021/8/16 22:06
 */
public class Test {
    public static void main(String[] args) {
        ShapeFacade shapeFacade = new ShapeFacade();
        shapeFacade.drawCircle();
        shapeFacade.drawRectangle();
        shapeFacade.drawSquare();
    }
}

5 扩展

5.1 设想1(链式+门面)

由于上述的实例中,调用的时候太丑了,而且略嫌麻烦,所以想改的美观方便一些。

draw方法的返回值为空,所以可以将门面中的方法的返回值设置为当前门面对象,就可以让门面方法实现链式访问了

5.1.1 修改后的门面

/**
 * 管理Shape的门面
 * @Author ChenJiahao(程序员五条)
 * @Date 2021/8/16 22:12
 */
public class ShapeFacade {
    private Shape circle;
    private Shape rectangle;
    private Shape square;

    public ShapeFacade() {
        circle = new Circle();
        rectangle = new Rectangle();
        square = new Square();
    }

    public ShapeFacade drawCircle(){
        circle.draw();
        return this;
    }

    public ShapeFacade drawRectangle(){
        rectangle.draw();
        return this;
    }

    public ShapeFacade drawSquare(){
        square.draw();
        return this;
    }
}

5.1.2 修改后的测试类

/**
 * @Author ChenJiahao(程序员五条)
 * @Date 2021/8/16 22:15
 */
public class Test {
    public static void main(String[] args) {
        ShapeFacade shapeFacade = new ShapeFacade();
        shapeFacade.drawCircle().drawRectangle().drawSquare();
    }
}

5.2 设想2(门面+工厂)

结论:方案不可行,最多只能改成门面+模板方法

思路

  1. 让门面也去实现接口
  2. 门面中不再写出每个具体事物对应的方法
  3. 门面中增加一个Map,用来存储相应对象
  4. 到此设想失败
  5. 方案不可行,最多只能改成门面+模板方法
  6. 门面+工厂的目的就是为了干掉门面中具体事物对应的方法,如果去掉了,在外面调用的时候还是得判断,没啥意义了

6 思维导图

在这里插入图片描述

7 示例源码地址

https://github.com/ChenJiahao0205/design-pattern/tree/master

最后

我是通过马士兵老师的视频和菜鸟教程学习的,部分内容可能会有雷同

想阅读更多设计模式相关文章,欢迎到我的专栏【设计模式学习笔记】、【设计模式】中去查看

在23篇设计模式文章发布完成之后,我会公开完整的思维导图,点关注,不迷路

感谢大家看到这里,文章如有不足,欢迎大家指出;彦祖点个赞吧彦祖点个赞吧彦祖点个赞吧,欢迎关注程序员五条

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五条Programmer

比心~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值