Facade(外观)
一、意图
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
二、结构
外观模式的结构如图7-35所示。
其中:
• Facade知道哪些子系统类负责处理请求;将客户的请求代理给适当的子系统对象。
• Subsystem classes实现子系统的功能;处理有Facade对象指派的任务;没有Facade的任何相关信息,即没有指向Facade的指针。
三、适用性
Facade模式适用于:
• 要为一个复杂子系统提供一个简单接口时,子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类,这使得子系统更具有可重用性,也更容易对子系统进行定制,但也给那些不需要定制子系统的用户带来一些使用上的困难。 Facade可以提供一个简单的默认视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过Facade层。
• 客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
•当需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。 如果子系统之间是相互依赖的,则可以让它们仅通过Facade进行通信,从而简化了它们之间的依赖关系。
四、实现
我们将创建一个 Shape 接口和实现了 Shape 接口的实体类。下一步是定义一个外观类 ShapeMaker。
ShapeMaker 类使用实体类来代表用户对这些类的调用。FacadePatternDemo 类使用 ShapeMaker 类来显示结果。
首先 创建一个接口
。
interface Shape {
void draw();
}
然后 创建实现接口的实体类
。
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("矩形被画出来了");
}
}
class Square implements Shape {
@Override
public void draw() {
System.out.println("正方形被画出来了");
}
}
class Circle implements Shape {
@Override
public void draw() {
System.out.println("圆被画出来了");
}
}
其次 创建一个外观类
。
class ShapeMaker {
private Shape circle;
private Shape rectangle;
private Shape square;
public ShapeMaker() {
circle = new Circle();
rectangle = new Rectangle();
square = new Square();
}
public void drawCircle(){
circle.draw();
}
public void drawRectangle(){
rectangle.draw();
}
public void drawSquare(){
square.draw();
}
}
最后 使用该外观类画出各种类型的形状
。
public class Facade {
public static void main(String[] args) {
// TODO Auto-generated method stub
ShapeMaker shapeMaker = new ShapeMaker();
shapeMaker.drawCircle();
shapeMaker.drawRectangle();
shapeMaker.drawSquare();
}
}
运行结果: