设计模式(10)------外观模式
2016-09-30 11:32
246 查看
外观模式作用:
为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
可以使得子系统与客户系统解耦。
应用场景:
(1) 当需要为一个复杂子系统提供一个简单接口时。子系统通常因为不断演化而变得越来越复杂。
大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,
但这也给那些不需要定制子系统的用户带来一些使用上的困难。facade可以提供一个简单的缺省视图,
这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过facade层。
(2) 客户程序与抽象类的实现部分之间存在着很大的依赖性。引入 facade将这个子系统与客户以及其他的子系统分离,
可以提高子系统的独立性 和可移植性。
(3) 当你需要构建一个层次结构的子系统时,使用 facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,
你可以让它们仅通过facade进行通讯,从而简化了它们之间的依赖关系。
参与对象:
(1)Facade(外观角色)
是模式的核心,他被客户client角色调用,知道各个子系统的功能。
将客户的请求代理给适当的子系统对象。
(2)Subsystem classes(子系统角色)
实现子系统的功能,并处理由Facade对象指派的任务。
对子系统而言,facade和client角色是未知的,没有Facade的任何相关信息;
即没有指向Facade的实例。
(3)client(客户程序)
调用facade角色获得完成相应的功能。
eg:
一个总电源开关控制电灯,冰箱,洗衣机,电视,电脑等家用电器的子开关,电源总开关即为外观模式。
Facade
Subsystem classes
灯开关功能实现
Test
运行结果
为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
可以使得子系统与客户系统解耦。
应用场景:
(1) 当需要为一个复杂子系统提供一个简单接口时。子系统通常因为不断演化而变得越来越复杂。
大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,
但这也给那些不需要定制子系统的用户带来一些使用上的困难。facade可以提供一个简单的缺省视图,
这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过facade层。
(2) 客户程序与抽象类的实现部分之间存在着很大的依赖性。引入 facade将这个子系统与客户以及其他的子系统分离,
可以提高子系统的独立性 和可移植性。
(3) 当你需要构建一个层次结构的子系统时,使用 facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,
你可以让它们仅通过facade进行通讯,从而简化了它们之间的依赖关系。
参与对象:
(1)Facade(外观角色)
是模式的核心,他被客户client角色调用,知道各个子系统的功能。
将客户的请求代理给适当的子系统对象。
(2)Subsystem classes(子系统角色)
实现子系统的功能,并处理由Facade对象指派的任务。
对子系统而言,facade和client角色是未知的,没有Facade的任何相关信息;
即没有指向Facade的实例。
(3)client(客户程序)
调用facade角色获得完成相应的功能。
eg:
一个总电源开关控制电灯,冰箱,洗衣机,电视,电脑等家用电器的子开关,电源总开关即为外观模式。
Facade
package com.lanhuigu.base.design.construct.facade; /** * * Facade: 外观核心,负责处理客户端的请求给合适的子系统对象 */ public class SwitchFacade { LightService ls; TelevisionService ts; public SwitchFacade() { // TODO Auto-generated constructor stub ls = new LightServiceImpl(); ts = new TelevisionServiceImpl(); } public void open() { ls.openLight(); ts.openTelevision(); } public void off() { ls.offLight(); ts.offTelevision(); } }
Subsystem classes
灯开关功能实现
package com.lanhuigu.base.design.construct.facade; /** * 子系统接口功能 */ public interface LightService { /** * 开灯 */ void openLight(); /** * 关灯 */ void offLight(); }
package com.lanhuigu.base.design.construct.facade; /** * SubSystemClass: 实现子系统的功能,负责接受facade分派的任务 */ public class LightServiceImpl implements LightService { @Override public void openLight() { // TODO Auto-generated method stub System.out.println("天黑了,开灯"); } @Override public void offLight() { // TODO Auto-generated method stub System.out.println("天亮了,关灯"); } }电视开关功能实现
package com.lanhuigu.base.design.construct.facade; /** * 子系统接口功能 */ public interface TelevisionService { /** * 开电视 */ void openTelevision(); /** * 关电视 */ void offTelevision(); }
package com.lanhuigu.base.design.construct.facade; /** * SubSystemClass: 实现子系统的功能,负责接受facade分派的任务 */ public class TelevisionServiceImpl implements TelevisionService { @Override public void openTelevision() { // TODO Auto-generated method stub System.out.println("下班的时候打开电视,看电视"); } @Override public void offTelevision() { // TODO Auto-generated method stub System.out.println("上班的时候关掉电视,去上班"); } }
Test
package com.lanhuigu.base.design.construct.facade; /** * Client负责调用facade,facade负责分派任务,SubSystemClass负责执行facade分派的任务 */ public class Test { public static void main(String[] args) { SwitchFacade facade = new SwitchFacade(); /* * Client */ facade.open(); System.out.println("======================="); facade.off(); } }
运行结果
相关文章推荐
- 设计模式笔记10:外观模式(Facade Pattern)
- 【设计模式】学习笔记10:外观模式(Facade)
- 设计模式(10)-外观模式
- golang设计模式(10)外观模式
- 设计模式(10)-结构型-外观模式(Facade)
- 【设计模式】10、外观模式
- 设计模式(10)——外观 Facade
- 设计模式(10) 门面/外观模式(简单入门 结构模式)
- 【设计模式 - 10】之外观模式(Facade)
- 设计模式10:外观模式【结构型】
- java学习笔记-设计模式10(外观模式)
- [设计模式] 10 外观模式 facade
- 【设计模式】—-(10)外观模式(结构型)
- C语言和设计模式(外观模式)10
- IOS设计模式学习(10)外观
- 重学java23种设计模式(10)外观模式
- 设计模式10: Facade 外观模式(结构型模式)
- Java设计模式10——外观模式
- 设计模式练习(10)——外观模式
- 设计模式(10)——Facade(外观)模式