设计模式--外观模式

一、外观模式定义

外观模式(Facade):为子系统的访问定义了对外的接口,隐藏了子系统内部调用的复杂性,从而使得外部对子系统的调用更方便,只需要调用这个接口即可。

举个例子,加入某人手里有点钱,想买股票,但是股票太多了,要去一个一个的了解太复杂了,因此有了基金经理和基金,只需要从基金经理手里买一定份额就行,剩下的炒股操作就交给基金经理了。买股票的人就相当于外部调用,股票就相当于复杂的子系统内部,而基金经理就相当于封装好的接口。

### 二、代码实例

我们将创建一个 Shape 接口和实现了 Shape 接口的实体类。下一步是定义一个外观类 ShapeMaker。

ShapeMaker 类使用实体类来代表用户对这些类的调用。FacadePatternDemo,我们的演示类使用 ShapeMaker 类来显示结果。

在这个例子中,ShapeMaker负责具体的去处理画什么图像,外部只需要调用ShapeMaker提供的方法即可,而具体的实现就在各个具体的图形中。类图如下:

首先创建接口:

public interface Shape {
   void draw();
}

然后创建实现接口的实体类:

public class Rectangle implements Shape {

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


public class Square implements Shape {

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

public class Circle implements Shape {

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

利用外观模式的思想,创建一个外观类:

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

,最后业务代码直接和外观类打交道即可,下面是业务代码:

public class FacadePatternDemo {
   public static void main(String[] args) {
      ShapeMaker shapeMaker = new ShapeMaker();

      shapeMaker.drawCircle();
      shapeMaker.drawRectangle();
      shapeMaker.drawSquare();      
   }
}

三、外观模式的优缺点

优点: 1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。效果图如下,可把一个复杂相互交叉的系统重构为依赖较少的系统:

缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。

使用场景: 1、为复杂的模块或子系统提供外界访问的模块。 2、子系统相对独立。 3、预防低水平人员带来的风险。4、为了维护一个遗留的大型老系统,同时也要兼容新系统的情况,为了让新老系统方便交互,可以中间加一层Facade。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值