【设计模式】外观模式
1.外观模式(Facade Pattern)的定义
外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通过外观类来调用内部子系统中方法,从而外观模式让客户和子系统之间避免了紧耦合。
2.外观模式的结构(转自:https://www.cnblogs.com/WindSun/p/10263511.html)
外观模式包含如下角色:
• Facade: 外观角色
• SubSystem:子系统角色
3.外观模式的应用场景(转自:https://zhuanlan.zhihu.com/p/421998619)
- 当需要简化并统一一个很大的接口或者一群复杂的接口时,使用外观模式
- 实现一个外观模式,需要将子系统组合进外观中,然后将工作委托给子系统执行
- 外观将客户从一个复杂的子系统中解耦
![](https://img2023.cnblogs.com/blog/736328/202303/736328-20230316163625287-626257775.png)
(上图转自: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
转载文章链接已标明,如有侵权请告知。文章仅作为知识记忆所用,如有错误,敬请指正。