外观模式(Facade):
为子系统中的一组接口提供一个一致的界面,定义了一个高层接口,这个接口使子系统更加容易使用。
适用性:
1.当你要为一个复杂子系统提供一个简单接口时,子系统往往因为不断演化而越来越复杂,大多数模式使用时都会产生更多更小的类,这使得子系统更具有可重用性,也更容易对子系统进行定制,但这也给这些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制的用户可以越过facade层。
2.客户程序与抽象类的实现部分之间存在着很大的依赖性。引入外观模式将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性
3.当你需要构建一个层次结构的子系统时,使用外观模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过外观模式进行通讯,从而简化了它们之间的依赖关系
参与者:
1.Facade
知道哪些子系统类负责处理请求,将客户的请求代理给适当的子系统对象
2.Subsystemclasses
实现子系统的功能,处理由facade对象指派的任务,没有facade的任何相关信息,即没有指向facade的指针
类图:
一个例子:
Subsystemclasses:
package car_package;
public class car {
public void start() {
System.out.println("车子已启动");
}
public void check_stop() {
System.out.println("刹车检查");
}
public void check_box() {
System.out.println("检查油箱");
}
public void check_console() {
System.out.println("检查仪表盘是否异常");
}
}
Facade:
package car_facade;
import car_package.car;
public class car_facade_imple {
public void car_go_go(car car_ref) {
car_ref.check_box();
car_ref.check_console();
car_ref.check_stop();
car_ref.start();
}
}
Test:
package run_main;
import car_facade.car_facade_imple;
import car_package.car;
public class run_main {
public static void main(String[] args) {
car_facade_imple car_facade_imple_ref = new car_facade_imple();
car_facade_imple_ref.car_go_go(new car());
}
}
result:
检查油箱
检查仪表盘是否异常
刹车检查
车子已启动
第二个例子:
package com.facade.test;
public interface ServiceA {
public void methodA();
}
package com.facade.test;
public interface ServiceB {
public void methodB();
}
package com.facade.test;
public interface ServiceC {
public void methodC();
}
package com.facade.test;
public class ServiceAImpl implements ServiceA {
@Override
public void methodA() {
// TODO Auto-generated method stub
System.out.println("method a is running......");
}
}
package com.facade.test;
public class ServiceBImpl implements ServiceB {
@Override
public void methodB() {
// TODO Auto-generated method stub
System.out.println("method b is running......");
}
}
package com.facade.test;
public class ServiceCImpl implements ServiceC {
@Override
public void methodC() {
// TODO Auto-generated method stub
System.out.println("method c is running......");
}
}
facade:把用到的接口都放到此类中,然后进行实例化,若要完成一个任务,需要用到其中某些对象的一些方法,则把这组相关方法组合起来,构成一个新的方法,这样的话,我们可以直接调用前面那个方法,从而完成某一个特定的功能:
package com.facade.test;
public class Facade {
ServiceA sa;
ServiceB sb;
ServiceC sc;
public Facade() {
sa = new ServiceAImpl();
sb = new ServiceBImpl();
sc = new ServiceCImpl();
}
public void methodA(){
sa.methodA();
sb.methodB();
}
public void methodB() {
sb.methodB();
sc.methodC();
}
public void methodC() {
sc.methodC();
sa.methodA();
}
}
test: 测试程序,当单独使用特定类的对象时和使用外观模式时进行对比,从而可以看出相应的效果:
package com.facade.test;
public class Test {
public static void main(String[] args) {
ServiceA sa = new ServiceAImpl();
ServiceB sb = new ServiceBImpl();
sa.methodA();
sb.methodB();
System.out.println("=====================");
Facade f = new Facade();
f.methodA();
f.methodB();
}
}
运行结果如下:
method a is running......
method b is running......
=====================
method a is running......
method b is running......
method b is running......
method c is running......
参考资料:
1.http://rainbowj234.diandian.com/post/2011-11-15/6839047
2.http://hi.baidu.com/576699909/item/ef7a8e13578271a3feded59d