外观模式

概述

在庞大而复杂的子系统中,客户端需要调用子系统中某些个方法实现业务服务,那么可以借助一个外观对象来简化客户端与子系统的对接,降低客户端与子系统的耦合,且客户端调用业务服务显得更简洁方便。

外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用

简单例子实现:

  • 子系统组件高层接口1
public interface demoInterface {//从子系统抽出的一个高层接口
    void Method();
}
  • 子系统组件高层接口2
public interface demoInterface2 {//从子系统抽出的一个高层接口
    void test();
}
  • 子系统组件
public class ServiceA implements demoInterface {
    public void Method() {
        System.out.println("实现业务A");
    }
}

public class ServiceB implements demoInterface{
    public void Method() {
        System.out.println("实现业务B");
    }
}

public class ServiceC implements demoInterface2{
    public void test() {
        System.out.println("实现业务C");
    }
}

public class ServiceD implements demoInterface2{
    public void test() {
        System.out.println("实现业务D");
    }
}
  • 外观对象,将需要的Api封装好(对象创建于逻辑代码)
public class FacadeMethod {
    private demoInterface a1;
    private demoInterface2 a2;

    public FacadeMethod(int type){
        switch (type) {
            case 1:{
                a1 = new ServiceA();
                a2 = new ServiceC();
            }
            case 2:{
                a1 = new ServiceA();
                a2 = new ServiceD();
            }
            case 3:{
                a1 = new ServiceB();
                a2 = new ServiceC();
            }
            case 4:{
                a1 = new ServiceB();
                a2 = new ServiceD();
            }

        }
    }

    public void method() {
        //还可加入其它业务逻辑代码
        a1.Method();
        a2.test();
    }
}
  • 客户端demo,客户端只需要引入外观对象,即可实现业务需求
public class demo {
    public static void main(String[] args) {
        FacadeMethod facadeMethod1 = new FacadeMethod(1);
        facadeMethod1.method();
        /*
        FacadeMethod facadeMethod2 = new FacadeMethod(2);
        facadeMethod2.method();
        FacadeMethod facadeMethod3 = new FacadeMethod(3);
        facadeMethod3.method();
        FacadeMethod facadeMethod4 = new FacadeMethod(4);
        facadeMethod4.method();*/
    }
}

适用场景

  • 系统中有多个复杂模块或子系统,某些业务需要其中一个或多个组件或逻辑稍复杂
  • 指向复杂子系统的已有的直接接口并不能满足业务需求

优点

  • 代码独立于复杂子系统和客户端之间,降低客户端代码与子系统的耦合度
  • 客户端对象数相对减少,更易使用组件,客户端代码变得简单

缺点

  • 外观对象与大多数对象都有耦合
posted @ 2020-09-24 22:44  Faink  阅读(116)  评论(0)    收藏  举报