zoukankan      html  css  js  c++  java
  • 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模块组合成为一个整体对外,不但方便了客户端的调用,而且封装了系统内部的细节功能。

     

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

  • 相关阅读:
    struts2 + ajax(从后台获取json格式的数据返回到前端,然后前端用jquery对json数据进行解析)
    request 中文乱码问题
    Eclipse 支持jQuery 自动提示
    基于按annotation的hibernate主键生成策略
    微信创建菜单操作
    百度转换经纬度为地址
    微信工具类(常用接口)的整理
    微信URL有效性验证
    原型模式 (原型管理器)
    发送邮件 Email(java实现)
  • 原文地址:https://www.cnblogs.com/baiduligang/p/4247422.html
Copyright © 2011-2022 走看看