外观模式(Facade)
子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
这种模式涉及到一个单一的类facade类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
一、外观模式实例结构图
二、代码实现
图形shape接口
/**
* 定义一个形状的接口,
* 一个画图的方法和计算面积的方法
*/
public interface Shape {
void draw();
double area(double a,double b);
}
Rectangle长方形实现Shape接口
/**
* Rectangle长方形
*/
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("绘画长方形:");
}
@Override
public double area(double a, double b) {
return a*b;
}
}
Square正方形实现Shape接口
/**
* Square正方形
*/
public class Square implements Shape {
@Override
public void draw() {
System.out.println("绘画正方形:");
}
@Override
public double area(double a, double b) {
return a*b;
}
}
外观类
/**
* 外观类,需要了解所欲子系统的方法或者属性
* 进行组合以备外界调用
*/
public class Facade {
private Shape shapeR;
private Shape shapeS;
public Facade() {
shapeR = new Rectangle();
shapeS = new Square();
}
public double getRectangle(double a,double b) {
shapeR.draw();
return shapeR.area(a, b);
}
public double getSquare(double a,double b) {
shapeS.draw();
return shapeS.area(a, b);
}
}
客户端
public static void main(String[] args) {
Facade facade = new Facade();
double recarea = facade.getRectangle(2, 5);
double squarea =facade.getSquare(5, 8);
System.out.println("正方形面积:"+squarea+"***"+"长方形面积:"+recarea);
}
结果
绘画长方形:
绘画正方形:
正方形面积:40.0***长方形面积:10.0
三、Facade模式的使用
1、在设计初期阶段,应该要有意识将不同的两个层分离(如java的三层架构开发),分层降低耦合性。层与层之间建立外观facade,这样可以为复杂的子系统提供一个简单的接口从而降低耦合性。
2、子系统往往因为不断的重构演化而变得越来越复杂,大多数的模式在使用时都会产生很多很小的类,这虽然是好事,但是也给外部调用他们的用户应用程序带来了使用上的困难。增加外观Facade可以提供一个简单的接口,减少了它们的依赖。
3、在维护一个遗留的大型系统时,可能这个系统已经很难维护和扩展,但是新系统有必须要使用这个系统里的重要的功能,那么你可以为新系统卡发一个外观Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰的简单接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。
主要:降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口
四、优点缺点
优点:
1、减少系统相互依赖。
2、提高灵活性。
3、提高了安全性。
缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。