外观模式

定义外观模式是软件工程中常用的一种软件设计模式。它为子系统中的一组接口提供一个统一的高层接口。这一接口使得子系统更加容易使用。
相比起观察者模式,适配器模式等适合小规模使用的设计模式,外观模式更多的是大范围的使用,它会是很多时候支撑我们整个架构的设计思路。
1,实际使用当中,接口并不是必须的,虽说根据依赖倒置原则,无论是处于高层的外观层,还是处于底层的子系统,都应该依赖于抽象,但是这会倒置子系统的每一个实现都要对应一个接口,从而导致系统的复杂性增加,所以这样做并不是必须的。

2,外观接口当中并不一定是子系统中某几个功能的组合,也可以是将子系统中某一个接口的某一功能单独暴露给客户端。

3,外观接口如果需要暴露给客户端很多的功能的话,可以将外观接口拆分为若干个外观接口,如此便会形成一层外观层。

package com.facade;

public interface Sub1 {

    void function1();
    
}
package com.facade;

public interface Sub2 {

    void function2();
    
}
package com.facade;

public interface Sub3 {

    void function3();
    
}
package com.facade;

public class Sub1Impl implements Sub1{

    public void function1() {
        System.out.println("子系统中Sub1接口的功能");
    }

}
package com.facade;

public class Sub2Impl implements Sub2{

    public void function2() {
        System.out.println("子系统中Sub2接口的功能");
    }

}
package com.facade;

public class Sub3Impl implements Sub3{

    public void function3() {
        System.out.println("子系统中Sub3接口的功能");
    }

}
package com.facade;

public interface Facade {
    
    /*  下面随便组装几个功能  */
    
    void function12();
    
    void function23();
    
    void function123();
    
}
package com.facade;

public class FacadeImpl implements Facade{

    private Sub1 sub1;
    
    private Sub2 sub2;
    
    private Sub3 sub3;
    
    public FacadeImpl() {
        super();
        this.sub1 = new Sub1Impl();
        this.sub2 = new Sub2Impl();
        this.sub3 = new Sub3Impl();
    }

    public FacadeImpl(Sub1 sub1, Sub2 sub2, Sub3 sub3) {
        super();
        this.sub1 = sub1;
        this.sub2 = sub2;
        this.sub3 = sub3;
    }

    public void function12() {
        sub1.function1();
        sub2.function2();
    }

    public void function23() {
        sub2.function2();
        sub3.function3();
    }

    public void function123() {
        sub1.function1();
        sub2.function2();
        sub3.function3();
    }

}
package com.facade;

public class Client {

    public static void main(String[] args) {
        Facade facade = new FacadeImpl();
        facade.function12();
        System.out.println("-------------------------");
        facade.function23();
        System.out.println("-------------------------");
        facade.function123();
        
        /*  以上为使用了外观模式的调用方式,以下为原始方式   */
        
        System.out.println("-------------以下原始方式--------------");
        Sub1 sub1 = new Sub1Impl();
        Sub2 sub2 = new Sub2Impl();
        Sub3 sub3 = new Sub3Impl();
        sub1.function1();
        sub2.function2();
        System.out.println("-------------------------");
        sub2.function2();
        sub3.function3();
        System.out.println("-------------------------");
        sub1.function1();
        sub2.function2();
        sub3.function3();
    }
    
}

graph BT
        sub-->sub1impl
        sub2-->sub2impl
        face-->sub2impl
        face-->sub1impl

你可能感兴趣的:(外观模式)