您的位置:首页 > 其它

设计模式(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

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();
}
}

运行结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: