门面模式(外观模式)

Posted Michael2397

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了门面模式(外观模式)相关的知识,希望对你有一定的参考价值。

参考:http://www.cnblogs.com/java-my-life/archive/2012/05/02/2478101.html

/DesignPatterns/src/com/louis/Facade/ModuleA.java

/**
 * Project Name:DesignPatterns
 * File Name:ModuleA.java
 * Package Name:com.louis.Facade
 * Date:2017年11月2日下午4:17:32
 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
 *
*/

package com.louis.Facade;
/**
 * ClassName:ModuleA 
 * Function: TODO ADD FUNCTION. 
 * Reason:     TODO ADD REASON. 
 * Date:     2017年11月2日 下午4:17:32 
 * @author   michael
 * @version  
 * @since    JDK 1.7
 * @see      
 */
public class ModuleA {
    //示意方法
    public void testA(){
        System.out.println("调用ModuleA中的testA方法");
    }
}

/DesignPatterns/src/com/louis/Facade/ModuleB.java

/**
 * Project Name:DesignPatterns
 * File Name:ModuleA.java
 * Package Name:com.louis.Facade
 * Date:2017年11月2日下午4:17:32
 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
 *
*/

package com.louis.Facade;
/**
 * ClassName:ModuleA 
 * Function: TODO ADD FUNCTION. 
 * Reason:     TODO ADD REASON. 
 * Date:     2017年11月2日 下午4:17:32 
 * @author   michael
 * @version  
 * @since    JDK 1.7
 * @see      
 */
public class ModuleB {
    //示意方法
    public void testB(){
        System.out.println("调用ModuleB中的testB方法");
    }
}

/DesignPatterns/src/com/louis/Facade/ModuleC.java

/**
 * Project Name:DesignPatterns
 * File Name:ModuleA.java
 * Package Name:com.louis.Facade
 * Date:2017年11月2日下午4:17:32
 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
 *
*/

package com.louis.Facade;
/**
 * ClassName:ModuleA 
 * Function: TODO ADD FUNCTION. 
 * Reason:     TODO ADD REASON. 
 * Date:     2017年11月2日 下午4:17:32 
 * @author   michael
 * @version  
 * @since    JDK 1.7
 * @see      
 */
public class ModuleC {
    //示意方法
    public void testC(){
        System.out.println("调用ModuleC中的testC方法");
    }
}

/DesignPatterns/src/com/louis/Facade/Facade.java

/**
 * Project Name:DesignPatterns
 * File Name:Facade.java
 * Package Name:com.louis.Facade
 * Date:2017年11月2日下午4:19:03
 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
 *
*/

package com.louis.Facade;
/**
 * ClassName:Facade 
 * Function: TODO ADD FUNCTION. 
 * Reason:     TODO ADD REASON. 
 * Date:     2017年11月2日 下午4:19:03 
 * @author   michael
 * @version  
 * @since    JDK 1.7
 * @see      
 */
public class Facade {
    public void test(){
        ModuleA a = new ModuleA();
        a.testA();
        ModuleB b = new ModuleB();
        b.testB();
        ModuleC c = new ModuleC();
        c.testC();
    }
}

/DesignPatterns/src/com/louis/Facade/Client.java

/**
 * Project Name:DesignPatterns
 * File Name:Client.java
 * Package Name:com.louis.Facade
 * Date:2017年11月2日下午4:20:14
 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
 *
*/

package com.louis.Facade;
/**
 * ClassName:Client 
 * Function: TODO ADD FUNCTION. 
 * Reason:     TODO ADD REASON. 
 * Date:     2017年11月2日 下午4:20:14 
 * @author   michael
 * @version  
 * @since    JDK 1.7
 * @see      
 */
public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.test();
    }
}
  使用门面模式还有一个附带的好处,就是能够有选择性地暴露方法。一个模块中定义的方法可以分成两部分,一部分是给子系统外部使用的,一部分是子系统内部模块之间相互调用时使用的。
有了Facade类,那么用于子系统内部模块之间相互调用的方法就不用暴露给子系统外部了。

/DesignPatterns/src/com/louis/Facade/ModuleAA.java

/**
 * Project Name:DesignPatterns
 * File Name:Module.java
 * Package Name:com.louis.Facade
 * Date:2017年11月2日下午4:25:11
 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
 *
*/

package com.louis.Facade;
/**
 * ClassName:Module 
 * Function: TODO ADD FUNCTION. 
 * Reason:     TODO ADD REASON. 
 * Date:     2017年11月2日 下午4:25:11 
 * @author   michael
 * @version  
 * @since    JDK 1.7
 * @see      
 */
public class ModuleAA {
     /**
     * 提供给子系统外部使用的方法
     */
    public void a1(){};
    
    /**
     * 子系统内部模块之间相互调用时使用的方法
     */
    public void a2(){};
    public void a3(){};
}

/DesignPatterns/src/com/louis/Facade/ModuleBB.java

/**
 * Project Name:DesignPatterns
 * File Name:Module.java
 * Package Name:com.louis.Facade
 * Date:2017年11月2日下午4:25:11
 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
 *
*/

package com.louis.Facade;
/**
 * ClassName:Module 
 * Function: TODO ADD FUNCTION. 
 * Reason:     TODO ADD REASON. 
 * Date:     2017年11月2日 下午4:25:11 
 * @author   michael
 * @version  
 * @since    JDK 1.7
 * @see      
 */
public class ModuleBB {
     /**
     * 提供给子系统外部使用的方法
     */
    public void b1(){};
    
    /**
     * 子系统内部模块之间相互调用时使用的方法
     */
    public void b2(){};
    public void b3(){};
}

/DesignPatterns/src/com/louis/Facade/ModuleCC.java

/**
 * Project Name:DesignPatterns
 * File Name:Module.java
 * Package Name:com.louis.Facade
 * Date:2017年11月2日下午4:25:11
 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
 *
*/

package com.louis.Facade;
/**
 * ClassName:Module 
 * Function: TODO ADD FUNCTION. 
 * Reason:     TODO ADD REASON. 
 * Date:     2017年11月2日 下午4:25:11 
 * @author   michael
 * @version  
 * @since    JDK 1.7
 * @see      
 */
public class ModuleCC {
     /**
     * 提供给子系统外部使用的方法
     */
    public void c1(){};
    
    /**
     * 子系统内部模块之间相互调用时使用的方法
     */
    public void c2(){};
    public void c3(){};
}

/DesignPatterns/src/com/louis/Facade/ModuleFacade.java

/**
 * Project Name:DesignPatterns
 * File Name:ModuleFacade.java
 * Package Name:com.louis.Facade
 * Date:2017年11月2日下午4:27:28
 * Copyright (c) 2017, 2692613726@qq.com All Rights Reserved.
 *
 */

package com.louis.Facade;

/**
 * ClassName:ModuleFacade Function: TODO ADD FUNCTION. Reason: TODO ADD REASON.
 * Date: 2017年11月2日 下午4:27:28
 * 
 * @author michael
 * @version
 * @since JDK 1.7
 * @see
 */
public class ModuleFacade {
    ModuleAA a = new ModuleAA();
    ModuleBB b = new ModuleBB();
    ModuleCC c = new ModuleCC();

    /**
     * 下面这些是A、B、C模块对子系统外部提供的方法
     */
    public void a1() {
        a.a1();
    }

    public void b1() {
        b.b1();
    }

    public void c1() {
        c.c1();
    }
}
这样定义一个ModuleFacade类可以有效地屏蔽内部的细节,免得客户端去调用Module类时,发现一些不需要它知道的方法。比如a2()和a3()方法就不需要让客户端知道,否则既暴露了内部的细节,又让客户端迷惑。对客户端来说,他可能还要去思考a2()、a3()方法用来干什么呢?其实a2()和a3()方法是内部模块之间交互的,原本就不是对子系统外部的,所以干脆就不要让客户端知道。

门面模式在Tomcat中的使用

参考:http://www.cnblogs.com/java-my-life/archive/2012/05/02/2478101.html

以上是关于门面模式(外观模式)的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之门面模式(外观模式)

设计模式之门面模式(外观模式)

门面模式(外观模式)

外观模式(门面模式)

外观模式(门面模式)

设计模式——外观模式(门面模式)