java设计模式-外观模式

一,概念介绍

  外观模式(Facade),他隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用

二,代码实现

    直接上代码吧,边看代码遍理解概念,我觉得这样效果也不错,

  第一步:先定义系统A、系统B、系统C这三个类,

package test;

/**
 *  A系统
 * @author ningbeibei
 *
 */
public class SystemA {
    //A系统方法
    public void functionA() {
        System.out.println("我是系统A...");
    }
}
package test;

/**
 *  B系统
 * @author ningbeibei
 *
 */
public class SystemB {
    //B系统方法
    public void functionB() {
        System.out.println("我是系统B...");
    }
package test;

/**
 *  C系统
 * @author ningbeibei
 *
 */
public class SystemC {
    //C系统方法
    public void functionC() {
        System.out.println("我是系统C...");
    }
}

第二步:定义一个高层接口,分别声明调用三个子系统得方法

package test;

/**
 * 定义一个更高层得接口,使其实现类实现所有方法
 * @author ningbeibei
 *
 */
public interface Facade {
    //方法A
    void methodA();
    //方法B
    void methodB();
    //方法C
    void methodC();
}

第三步:实现定义得高层接口,并且持有子系统对象引用

package test;

/**
  * 实现我们刚才定义得高层接口中得方法 
 * @author ningbeibei
 *
 */
public class FacadeImpl implements Facade {

    //这个系统需要实现类中持有他得引用。
    private SystemA systema;
    private SystemB systemb;
    private SystemC systemc;
    
    /**
     * 重写实现类构造方法,初始化这个三个类得对象
     */
    FacadeImpl(){
        systema = new SystemA();
        systemb = new SystemB();
        systemc = new SystemC();
        
    }
    
    //调用A系统方法
    @Override
    public void methodA() {
        systema.functionA();
    }
    //调用B系统方法
    @Override
    public void methodB() {
        systemb.functionB();
    }
    //调用B系统方法
    @Override
    public void methodC() {
        systemc.functionC();
    }

}

第四步:测试类编写

package test;

/**
 * 测试类
 * @author ningbeibei
 *
 */
public class test1 {

    //测试方法
    public static void main(String[] args) {
        
        /**客户端在调用这个三个系统时只需要通过Facade
         * 这个接口就可以访问各个系统得方法*/
        Facade fac = new FacadeImpl();
        fac.methodA();
        fac.methodB();
        fac.methodC();
    }

}

运行结果

java设计模式-外观模式

 

 

三、优点

  - 松散耦合

  使得客户端和子系统之间解耦,让子系统内部的模块功能更容易扩展和维护;

  - 简单易用

  客户端根本不需要知道子系统内部的实现,或者根本不需要知道子系统内部的构成,它只需要跟Facade类交互即可。

  - 更好的划分访问层次

  有些方法是对系统外的,有些方法是系统内部相互交互的使用的。子系统把那些暴露给外部的功能集中到门面中,这样就可以实现客户端的使用,很好的隐藏了子系统内部的细节。

 

四、我写得不足之处望各位批评指正

 

发表评论

相关文章