十一,外观模式

1,外观模式

什么是外观模式?外观模式可以类比成我们在生活中买电脑这件事。买电脑我们可以到各个相关的电脑配件的店里买相关的电脑配件,例如主板,内存条,CPU等配件,我们也可以通过一些商家去买人家组装好的电脑,在这里通过商家买到电脑的方式就是一个外观模式。商家的作用屏蔽了客户对于组装电脑的细节,客户不需要在意这个电脑是怎么组装完成的,而组装电脑的细节部分都是由卖电脑的商家实现的;当然我们也可以自己去组装电脑,但是前提是自己知道怎么组装电脑和解决各个组件之间的兼容性问题。
在计算机系统中客户端访问系统中的组件,客户端需要知道自己如何访问系统中的组件,一旦系统中的接口组件有变化,客户端也要做出相应的变化,就好像下面的图中所示:
这里写图片描述
但是如果我们在系统和客户端中间加上一层界面,统一下客户端对系统的访问接口,这样不管组件如何变化,对于客户端而言,组件变化是透明的,有利于客户端和系统的解耦。如下图:
这里写图片描述

2,代码实现

package com.conjane.facade;

public class Client {

    public static void main(String[] args) {
        new Facade().getComponent();
    }
}
package com.conjane.facade;


public class Facade {

    public void getComponent(){
        ModuleA moduleA = new ModuleA();
        moduleA.getModule();
        ModuleB moduleB = new ModuleB();
        moduleB.getModule();
        ModuleC moduleC = new ModuleC();
        moduleC.getModule();
    }
}
package com.conjane.facade;

public class ModuleA {

    public void getModule(){
        System.out.println("得到moduleA");
    }
}
package com.conjane.facade;

public class ModuleB {

    public void getModule(){
        System.out.println("得到moduleB");
    }
}
package com.conjane.facade;

public class ModuleC {

    public void getModule() {
        // TODO Auto-generated method stub
        System.out.println("得到moduleC");
    }
}

3,外观模式带来的思考

从客户端和组件的直接交互到客户端和外观对象的交互,或许只是访问组件的代码从客户端移动到外观对象中去,但这样的操作屏蔽了外部客户端和系统内部模块的交互。虽然引入了外观对象在系统中,但是当我们想要直接访问系统中的组件也是可以访问的,不是说有了外观对象,我们访问组件的方式就必须要通过外观对象来实现,这样的操作也为我们的代码实现带来了一定的灵活性。外观模式的目的不是给子系统添加新的功能接口,而是为了让外部减少子系统内部多个模块的交互,松散耦合,从而让外部能够更加单地使用子系统。

4,外观模式和其他模式对比

4.1,外观模式和中介者模式

外观模式处于外部系统和内部系统之间,而中介者模式是负责系统内部各个模块之间的交互,是负责各个模块之间的松散耦合。

4.2,外观模式和单例模式

通常一个子系统只需要一个外观实例,所以外观模式可以和单例模式组合使用,把facade类实现成为单例。也可以将外观类的构造方法私有化,然后把提供给客户端的方法实现成为静态的。

猜你喜欢

转载自blog.csdn.net/u010871004/article/details/79705230