Java设计模式 —— 外观模式(Facade)

Java设计模式 —— 外观模式(Facade)

定义

外观模式:外观模式也叫门面模式,为子系统中的一组接口提供一致的界面,facade提供了一高层接口,这个接口使得子系统更容易使用。

特征:

  1. 外观模式对外隐藏了子系统的实现细节,减少了客户端对子系统的耦合
  2. 外观类对子系统的接口封装,使得系统更易于使用

代码实现

步骤 1:创建一个接口。
Shape.java

public interface Shape {
   void draw();
}

步骤 2:创建实现接口的实体类。
Rectangle.java

public class Rectangle implements Shape {
 
   @Override
   public void draw() {
      System.out.println("Rectangle::draw()");
   }
}

Square.java

public class Square implements Shape {
 
   @Override
   public void draw() {
      System.out.println("Square::draw()");
   }
}

Circle.java

public class Circle implements Shape {
 
   @Override
   public void draw() {
      System.out.println("Circle::draw()");
   }
}

步骤 3:创建一个外观类。
ShapeMaker.java

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

步骤 4:使用该外观类画出各种类型的形状。
FacadePatternDemo.java

public class FacadePatternDemo {
   public static void main(String[] args) {
      ShapeMaker shapeMaker = new ShapeMaker();
 
      shapeMaker.drawCircle();
      shapeMaker.drawRectangle();
      shapeMaker.drawSquare();      
   }
}

步骤 5:执行程序,输出结果:
Circle::draw()
Rectangle::draw()
Square::draw()

外观模式使用问题

在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了开闭原则

与适配器模式的区别:

1、适配器模式是将一个对象包装起来以改变其接口,而外观模式是将一群对象包装起来以简化其接口。
2、适配器是将接口转换为不同接口,而外观模式是提供一个统一的接口来简化接口。

Android中外观模式

ContextImpl.java 实现 Context 定义的接口 xref: /frameworks/base/core/java/android/app/ContextImpl.java,
Activity 的调转、发送广播、启动服务、设置壁纸等,这项工作并不在 ContextImpl 中实现,而是转交其它子类实现,
例如 startActivity() 是通过 ActivityManagerService 来实现的 xref: /frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java。
通过封装的方式,Context类隐藏了这些细节,只需要通过 Context 这个接口统一进行 Android 系统的交互。

感谢

segmentfault: 外观模式
菜鸟教程:外观模式
百度百科:外观模式
博客园:《JAVA与模式》之代理模式

你可能感兴趣的:(Java)