`
安卓干货铺
  • 浏览: 34612 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

设计模式(13)-外观模式详解(易懂)

阅读更多

外观模式的定义

外观模式(Facade),也被称为“门面模式”,为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。

模型:

  • Facade:外观角色,了解子系统所有的方法和任务,此角色有自己的方法,client通过此角色方法来调用子系统的功能

  • Subsystem:子系统角色,可以是一个也可以是多个,子系统是分化的不同的处理模块,不是单独的类。

代码演示:

1.子系统:

public class SubsystemA {

   public  void methodA(){
       Log.d("qzs","子系统A");
   }
}

public class SubsystemB {
   public  void  methodB(){
       Log.d("qzs","子系统B");
   }
}

强调一下:这两个类不是独立的,可以看成是一个集合。如果不明白的话,往下面去看实例说明,应该好懂一些。

2.外观类:

public class Facade  {
   private  SubsystemA subsystemA=new SubsystemA();
   private SubsystemB subsystemB=new SubsystemB();
   //提供给客户端调用的方法
   public  void  methodFacade(){

       subsystemA.methodA();
       subsystemB.methodB();
   }
}

对外提供的方法根据客户端的需求来决定。下面通过一个实例来了解一下。

实例说明

例如我们在今日头条或者微信公众号上发布文章,经常分为两步:

  • 编写文章内容并提交文章

  • 审核(审核通过才能发布成功)

1.子系统

 

public class Content {
   //编写的文章内容
   public  void  articleContent(String str){
       Log.d("qzs",str);
   }
   //发布文章
   public  void  release(){
       Log.d("qzs","点击提交-发布");
   }
}

public class Examine {
     //文章审核
   public  void  articleExamine(Content content){
       Log.d("qzs","此文章审核通过了");
   }
}

 

2.外观类

public class Facade {
   private  Examine examine=new Examine();
   private  Content content=new Content();

   
  // 对外提供的处理方法
   public  void  Call(String str){
       content.articleContent(str);
       content.release();
       examine.articleExamine(content);
   }
}

 

3.调用:

       String str="编写的文章的内容";
       Facade facade=new Facade();
       facade.Call(str);

运行:

 

强调:

子系统每个类不是独立的,两个类分为不同的模块并形成一个集合;另外子系统每个类中的方法数可以是一个或者多个。

实外观模式的优缺点及其他

1.优点

  • 减少系统的相互依赖,客户端只能调用外观类的方法

  • 提高安全性

  • 子系统是隐藏的

2.缺点

不符合开闭原则!!,如果对开闭原则不熟悉的朋友可以看下面的文章:

六大设计原则详解(6)-开闭原则

3.适用场景

在以下情况下可以考虑使用外观模式:

  • 设计初期阶段,应该有意识的将不同层分离,层与层之间建立外观模式。

  •  开发阶段,子系统越来越复杂,增加外观模式提供一个简单的调用接口。

  • 维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。

本文部分定义来源于网络

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics