java设计模式--外观模式

java设计模式--外观模式

 

举例:
现在去某个政府部门办理一个营业执照,需要经历下面几道手续:
1.先去A部门盖章
2.再去B部门盖章
3.最后去C部门盖章
4.经历了这三道手续后一个营业执照就办理好了


下面不用设计模块的解决方案:

复制代码
public class GovernmentA
{
    public void dealWith()
    {
        System.out.println("部门A的章盖好了");
    }
}
复制代码

 

复制代码
public class GovernmentB
{
    public void dealWith()
    {
        System.out.println("部门B的章盖好了");
    }
}
复制代码

 

复制代码
public class GovernmentC
{
    public void dealWith()
    {
        System.out.println("部门C的章盖好了");
    }
}
复制代码

 

复制代码
public class Client
{
    public static void main(String[] args)
    {
        new GovernmentA().dealWith();
        new GovernmentB().dealWith();
        new GovernmentC().dealWith();
    }
}
复制代码

运行结果:

部门A的章盖好了
部门B的章盖好了
部门C的章盖好了

上面的实现方法有何问题:
客户端为了使用这个功能,需要与子系统内的多个模块交互。
这对于客户端而言,相当麻烦,使得客户端不能简单的使用系统功能,而且,如果
其中的某个模块方式了变化,还可能会引起客户端也要随着变化。


 

 

使用外观模式来解决上诉的问题:


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

public interface GovernmentAService
{
    public void dealWith();
}
复制代码
public class GovernmentAServiceImpl implements GovernmentAService
{
    @Override
    public void dealWith()
    {
        System.out.println("部门A的章盖好了....");
    }
}
复制代码
public interface GovernmentBService
{
    public void dealWith();
}
复制代码
public class GovernmentBServiceImpl implements GovernmentBService
{
    @Override
    public void dealWith()
    {
        System.out.println("部门B的章盖好了...");
    }
}
复制代码
public interface GovernmentCService
{
    public void dealWith();
}

 

复制代码
public class GovernmentCServiceImpl implements GovernmentCService
{
    @Override
    public void dealWith()
    {
        System.out.println("部门C章已经盖好了...");
    }
}
复制代码
复制代码
/**
 * 功能:
 *         外观对象
 * @author Administrator
 *
 */
public class Facade
{
    public void deailWith()
    {
        GovernmentAService a = new GovernmentAServiceImpl();
        a.dealWith();
        
        GovernmentBService b = new GovernmentBServiceImpl();
        b.dealWith();
        
        GovernmentCService c = new GovernmentCServiceImpl();
        c.dealWith();
    }
}
复制代码
复制代码
public class Client
{
    public static void main(String[] args)
    {
        new Facade().deailWith();
    }
}
复制代码

运行结果:

部门A的章盖好了....
部门B的章盖好了...
部门C章已经盖好了...

 


 

 

外观模式的目的:
外观模式的目的不是给予子系统添加新的功能接口,而是为了让外部减少与子系统内多个模块的交互,松散耦合,
从而让外部能够更简单地使用子系统。

 

使用外观模式和不使用外观模式相比有何变化?

   看到Facade的实现,可能有人说,这不就是把原来的客户端的代码搬到Facade里面吗?没有什么变化?

但是实质上是发生了变化,因为Facade是位于部门A,B,C模块组成的系统这边,那么它就相当于屏蔽了外部客户端和系统内部模块的将会,

从而把部门A,B,C模块组合成为一个整体对外,不但方便了客户端的调用,而且封装了系统内部的细节功能。

 

外观模式的本质是:封装交互,简化调用。

原文地址:https://www.cnblogs.com/baiduligang/p/4247422.html