您的位置:首页 > 编程语言 > Java开发

JAVA设计模式——外观模式

2018-01-22 09:34 281 查看
外观模式(又称为门面模式)是一种结构型设计模式。外观模式的思想是:为子系统的各个模块提供一个统一的门面,由门面负责对客户提供服务

外观模式涉及2个角色:

门面(Facade):负责为客户提供服务,将所有从客户端发来的请求委派到相应的子系统去。

子系统(Subsystem):子系统中包含多个模块。可包含一个或多个子系统。每个子系统都可以被客户端直接调用,或者被门面角色调用,子系统并不知道门面的存在。

当一次的功能访问同时调用到多个对象时,可以使用外观模式。例如,在分布式应用中,通过远程调用服务,使用外观模式可以降低应用程序与服务的交互次数,同时可以降低应用程序的复杂性。

代码实现如下:

子系统:

public class ModuleA{
public void method(){
System.out.println("Module A");
}
}

public class ModuleB{
public void method(){
System.out.println("Module B");
}
}

public class ModuleC{
public void method(){
System.out.println("Module C");
}
}


门面:

public class Facade {
private ModuleA a = new ModuleA();
private ModuleB b = new ModuleB();
private ModuleC c = new ModuleC();

public void method() {
a.method();
b.method();
c.method();
}
}


客户:

public class Client {
private Facade facade = new Facade();

public void method() {
facade.method();
}
}

// 测试
class FacadeTest {
public static void main(String[] args) {
Client client = new Client();
client.method();
}
}


运行结果:

Module A

Module B

Module C

结构图:



当想选择性地暴露子系统模块的方法时,可以使用外观模式。

代码实现如下:

子系统:

public class ModuleA{
public void method1(){
System.out.println("Module A 1");
}
public void method2(){ // 不想暴露这个方法给客户
System.out.println("Module A 2");
}
}

public class ModuleB{
public void method1(){
System.out.println("Module B 1");
}
public void method2(){ // 不想暴露这个方法给客户
System.out.println("Module B 2");
}
}

public class ModuleC{
public void method1(){
System.out.println("Module C 1");
}
public void method2(){ // 不想暴露这个方法给客户
System.out.println("Module C 2");
}
}


门面:

public class Facade {
private ModuleA a = new ModuleA();
private ModuleB b = new ModuleB();
private ModuleC c = new ModuleC();

public void methodA() { a.method1(); }
public void methodB() { b.method1(); }
public void methodC() { c.method1(); }
}


客户:

public class Client {
private Facade facade = new Facade();

public void method() {
facade.methodA();
facade.methodB();
facade.methodC();
}
}

// 测试
class FacadeTest {
public static void main(String[] args) {
Client client = new Client();
client.method();
}
}


运行结果:

Module A 1

Module B 1

Module C 1

结构图:



外观模式松散了客户端与子系统的耦合关系,让子系统内部的模块能更容易扩展和维护。

外观模式让子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要跟众多子系统内部的模块进行交互,只需要跟门面类交互就可以了。

通过合理使用Facade,可以帮助我们更好地划分访问的层次。有些方法是对系统外的,有些方法是系统内部使用的。把需要暴露给外部的功能集中到门面中,这样既方便客户端使用,也很好地隐藏了内部的细节。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息