设计模式-外观模式
Posted yijinqincai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-外观模式相关的知识,希望对你有一定的参考价值。
本片文章主要介绍外观模式。
外观模式:为子系统中一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
我们先看下结构图:
下面我们就以这个结构图写个简单的例子:
首先是四个子系统的代码。
package com.lwx.facade; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-03-31 * Time: 11:02 */ public class SubSystemOne { public void method1() { System.out.println("子系统方法一"); } }
package com.lwx.facade; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-03-31 * Time: 11:03 */ public class SubSystemTwo { public void method2() { System.out.println("子系统方法二"); } }
package com.lwx.facade; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-03-31 * Time: 11:03 */ public class SubSystemThree { public void method3() { System.out.println("子系统方法三"); } }
package com.lwx.facade; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-03-31 * Time: 11:04 */ public class SubSystemFour { public void method4() { System.out.println("子系统方法四"); } }
然后是外观类,它需要了解所有的子系统的方法或属性,进行组合,以备外界调用。
package com.lwx.facade; /** * Created with IntelliJ IDEA. * Description: 外观类 * User: lwx * Date: 2019-03-31 * Time: 11:05 */ public class Facade { private SubSystemOne subSystemOne; private SubSystemTwo subSystemTwo; private SubSystemThree subSystemThree; private SubSystemFour subSystemFour; public Facade() { this.subSystemOne = new SubSystemOne(); this.subSystemTwo = new SubSystemTwo(); this.subSystemThree = new SubSystemThree(); this.subSystemFour = new SubSystemFour(); } public void methodsA() { System.out.println("方法组A"); subSystemOne.method1(); subSystemTwo.method2(); subSystemFour.method4(); } public void methodsB() { System.out.println("方法组B"); subSystemTwo.method2(); subSystemThree.method3(); } }
然后我们看下测试类和运行结果。
package com.lwx.facade; /** * Created with IntelliJ IDEA. * Description: * User: lwx * Date: 2019-03-31 * Time: 11:07 */ public class FacadeTest { public static void main(String[] args) { Facade facade = new Facade(); facade.methodsA(); facade.methodsB(); } }
对于面向对象有一定基础的朋友,即使没有听说过外观模式,也完全有可能在很多时候使用它;比如java web开发的项目中有很多的service和dao,这一层service有一个非常重要的作用,就是为了方便我们管理项目中与业务逻辑相关的事物,service层同时也是组合dao层暴露给controller层或action层的功能;外观模式还完美地体现了依赖倒转原则和迪米特法则的思想,所以是非常常用的模式之一。
总结一下外观模式的优点和缺点:
优点:
1.引入外观模式可以提供一个简单的借口,减少客户和子系统之间的依赖。
2.在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,这时候如果有新系统必需依赖于它就可以为新系统开发一个外观类,来提供粗糙或高度复杂的遗留代码的比较清晰的接口,让新系统与外观类交互,外观类与遗留代码交互所有复杂工作。
缺点:
1.不能很好地限制客户使用子系统,如果对客户访问子系统类做太多限制减少了可变性和灵活性。
2.在不引入外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
最后附上demo的githup地址:https://github.com/yijinqincai/design_patterns
以上是关于设计模式-外观模式的主要内容,如果未能解决你的问题,请参考以下文章