【设计模式】外观模式

1.外观模式(Facade Pattern)的定义

外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部子系统中方法,从而外观模式让客户和子系统之间避免了紧耦合。

2.外观模式的结构(转自:https://www.cnblogs.com/WindSun/p/10263511.html)

  外观模式包含如下角色:

    • Facade: 外观角色
    • SubSystem:子系统角色
 
3.外观模式的应用场景(转自:https://zhuanlan.zhihu.com/p/421998619)
  • 当需要简化并统一一个很大的接口或者一群复杂的接口时,使用外观模式
  • 实现一个外观模式,需要将子系统组合进外观中,然后将工作委托给子系统执行
  • 外观将客户从一个复杂的子系统中解耦

 

 (上图转自:https://www.cnblogs.com/WindSun/p/10263511.html)

4.示例
Add.java
package com.computer;

public class Add {
    public double addNumber(double d1,double d2)
    {
        double d= d1+d2;
        return d;
    }
}

Minus.java

package com.computer;

public class Minus {
    public double minusNumber(double d1,double d2)
    {
        double d= d1-d2;
        return d;
    }
}

Multiply.java

package com.computer;

public class Multiply {
    public double multiplyNumber(double d1,double d2)
    {
        double d= d1*d2;
        return d;
    }
}

Divide.java

package com.computer;

public class Divide {
    public double divideNumber(double d1,double d2)
    {
        double d= d1/d2;
        return d;
    }
}

Facade.java

package com.computer;

public class Facade {
   private Add add;
   private Minus minus;
   private Divide divide;
   private Multiply multiply;
   
   public Facade()
   {
       add = new Add();
       minus = new Minus();
       divide = new Divide();
       multiply = new Multiply();
   }
   
   public double addNum(double d1,double d2)
   {
       double n = add.addNumber(d1, d2);
       return n;
   }
   
   public double minusNum(double d1,double d2)
   {
       double n =minus.minusNumber(d1, d2);
       return n;
   }
   
   public double divideNum(double d1,double d2)
   {
       double n = divide.divideNumber(d1, d2);
       return n;
   }
   
   public double multiplyNum(double d1,double d2)
   {
       double n = multiply.multiplyNumber(d1, d2);
       return n;
   }
    
}

Client.java

package com.computer;

public class Client {
  public static void main(String[] args) {
    Facade facade = new Facade();
    double n1=60;
    double n2=20;
    
    double add = facade.addNum(n1, n2);
    double minus = facade.minusNum(n1, n2);
    double divide = facade.divideNum(n1, n2);
    double multiply = facade.multiplyNum(n1, n2);
    
    System.out.println(add);
    System.out.println(minus);    
    System.out.println(divide);    
    System.out.println(multiply);    
 }
}

 运行结果

 5.外观模式的优缺点(转自:https://www.cnblogs.com/WindSun/p/10263511.html)

优点
    • 对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易。通过引入外观模式,客户代码将变得很简单,与之关联的对象也很少。
    • 实现了子系统与客户之间的松耦合关系,这使得子系统的组件变化不会影响到调用它的客户类,只需要调整外观类即可。
    • 降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程,因为编译一个子系统一般不需要编译所有其他的子系统。一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。
    • 只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类。
缺点
    • 不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性。
    • 在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
 
 
参考文章:
https://www.cnblogs.com/WindSun/p/10263511.html
 https://zhuanlan.zhihu.com/p/421998619
posted @ 2023-03-16 11:52  YorkShare  阅读(63)  评论(0编辑  收藏  举报