课程名称:Java设计模式精讲 Debug方式+内存分析
课程章节:第9章 原型模式讲解+Coding+源码解析
主讲老师:Geely
课程内容:
外观设计模式(结构型)(门面模式)
问题1)定义?
对外它给使用者提供了一个统一的接口(或类),对内它封装子系统。(外观者的例子最典型的就是日志。)
具体操作:定义一个高层接口(或类),将子系统注入到外观类中,客户端调用外观类,不关心子系统
外观角色:了解子系统的所有方法,还有自己的方法。
客户端调用外观角色。
两个角色:
门面(Facade)角色 :客户端可以调用这个角色的方法。此角色知晓相关的(一个或者多个)子系统的功能和责任。在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去。
子系统(SubSystem)角色 :可以同时有一个或者多个子系统。每个子系统都不是一个单独的类,而是一个类的集合(如上面的子系统就是由ModuleA、ModuleB、ModuleC三个类组合而成)。每个子系统都可以被客户端直接调用,或者被门面角色调用。子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端而已。
问题2)使用场景?
子系统多而且复杂,增加外观模式提供简单调用接口。
构建多层系统结构,利用外观对象作为每层的入口。简化层间调用。
外观模式是迪米特法则,最少知道原则的体现。
外观模式(门面模式)的作用就是,统一了请求接口。如果没有门面模式,请求者需要,一个个的去调用这些接口才能完成任务。现在只需要调用一个统一的外观(门面)接口,就可以。
问题3)优点和缺点?
**优点:**简化了调用过程,无需了解子系统。
减少系统依赖,松散耦合。
更好的划分访问层次。
符合迪米特法则,即知道最少原则。
**缺点:**不符合开闭原则,
增加子系统,扩展系统行为容易引入风险。
问题4)外观模式和中介模式区别?和单例模式,抽象工厂的使用?
外观模式关注的是,外界和子系统之间的交互。
中介模式关注的是,子系统内部之间的交互。
外观模式和单例模式: 通常我们将外观模式的外观角色做成单例模式的。
外观类可以通过抽象工厂,获取子系统的实例。
问题5)外观模式的实例?
积分兑换礼物包含三个子系统:校验积分,支付积分,物流。三个子系统。
这个三个子系统通过一个外观类,将三个子系统通过成员变量注入到外观类当中。客户端直接调用外观类,不需要自己创建这三个子系统的对象。而是通过外观类自己创建。(通过直接new,或者注入的方式。)
如图:test只关心外观类。客户端test只创建外观类,其他三个子系统都是由外观类创建。
例如:门面模式就是提供统一的对外接口(接口不是指的java的接口概念,而是对外开放的api。)
如果没有这个门面,包工头。我们想建一个房子,就需要去自己找和泥的,搬砖的,砌墙的。去管理好流程。先和泥,后搬砖,最后砌墙。
例子:
public class mix_mortar {
public void mixMorter(){
System._out_.println("我正在mixMorter和泥");
}
}
public class moving_bricks {
public void moving_bricks(){
System._out_.println("我正在搬砖...");
}
}
public class masonry_wall {
public void masonryWall(){
System._out_.println("我正在砌墙...");
}
}
public class facadeTest001 {
public void facadeTest(){
masonry_wall warll = new masonry_wall();
mix_mortar mortar = new mix_mortar();
moving_bricks bricks = new moving_bricks();
mortar.mixMorter();
bricks.moving_bricks();
warll.masonryWall();
}
}
问题6)外观模式在jdk的使用?
例如:log4j日志。就使用了门面模式。提供统一的接口。屏蔽了底层不同的实现。
1、JdbcUtils 中的方法都是封装了各种子系统。
closeConnection()
closeConnection()
closeResultSet() 等方法。都是通过封装子系统的方法。
2、Tomcat源码中使用了很多外观模式。通过搜索 façade类就可以找到很多。
RequestFacade等
共同学习,写下你的评论
评论加载中...
作者其他优质文章