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