设计模式六大原则(1):单一职责原则
设计模式六大原则(2):里氏替换原则
设计模式六大原则(3):依赖倒置原则
设计模式六大原则(4):接口隔离原则
设计模式六大原则(5):迪米特法则
设计模式六大原则(6):开闭原则


若有理解不到位,欢迎留言讨论!


外观设计模式典型实例:显示生活中有一个种电视万能遥控器,只要和电视配对好了以后,就可以正常使用,不同型号的电视,只要一旦适配,所有的操作模式一模一样。这就是一种外观适配模式。表面上都是同一个遥控器,实际上不同型号的电视,不同的操作,发出的型号可能各不相同。但是对于用户来说,没有任何差别。定义,要求一个子系统的外部和其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易使用。

FacadePattern,UML抽象图百度找,代码实现如下

使用外观设计模式设计一个子系统拥有三个模块,每个模块都有三个方法,其中一个为客户端调用方法,其它两个为各个子模块间互相调用方法。此时客户端需要组合三个模块中的方法才能完成功能。

子系统抽象类

  1. package FacadePattern;
  2. public interface AModuleApi {
  3. //此方法用于外部调用
  4. public void a1();
  5. //以下两个方法主要用于子系统内部间系统调用
  6. public void a2();
  7. public void a3();
  8. }
  1. package FacadePattern;
  2. public interface BModuleApi {
  3. //此方法用于外部调用
  4. public void b1();
  5. //以下两个方法主要用于子系统内部间系统调用
  6. public void b2();
  7. public void b3();
  8. }
  1. package FacadePattern;
  2. public interface CModuleApi {
  3. //此方法用于外部调用
  4. public void c1();
  5. //以下两个方法主要用于子系统内部间系统调用
  6. public void c2();
  7. public void c3();
  8. }

子系统实现类

  1. package FacadePattern.ModuleImpl;
  2. import FacadePattern.AModuleApi;
  3. public class AModuleImpl implements AModuleApi {
  4. public void a1() {
  5. System.out.println("调用了A模块");
  6. }
  7. public void a2() {
  8. // 主要用于子模块之间的相互调用
  9. }
  10. public void a3() {
  11. // 主要用于子模块之间的相互调用
  12. }
  13. }
  1. package FacadePattern.ModuleImpl;
  2. import FacadePattern.BModuleApi;
  3. public class BModuleImpl implements BModuleApi {
  4. public void b1() {
  5. System.out.println("调用了B模块");
  6. }
  7. public void b2() {
  8. // 主要用于子模块之间的相互调用
  9. }
  10. public void b3() {
  11. // 主要用于子模块之间的相互调用
  12. }
  13. }
  1. package FacadePattern.ModuleImpl;
  2. import FacadePattern.CModuleApi;
  3. public class CModuleImpl implements CModuleApi {
  4. public void c1() {
  5. System.out.println("调用了C模块");
  6. }
  7. public void c2() {
  8. // 主要用于子模块之间的相互调用
  9. }
  10. public void c3() {
  11. // 主要用于子模块之间的相互调用
  12. }
  13. }

非外观设计模式客户端

  1. package FacadePattern.Test;
  2. import FacadePattern.AModuleApi;
  3. import FacadePattern.BModuleApi;
  4. import FacadePattern.CModuleApi;
  5. import FacadePattern.ModuleImpl.AModuleImpl;
  6. import FacadePattern.ModuleImpl.BModuleImpl;
  7. import FacadePattern.ModuleImpl.CModuleImpl;
  8. public class NoFacadeClient {
  9. public static void main(String[] args) {
  10. AModuleApi aModule = new AModuleImpl();
  11. aModule.a1(); //启动子系统一
  12. BModuleApi bModule = new BModuleImpl();
  13. bModule.b1(); //启动子系统二
  14. CModuleApi cModule = new CModuleImpl();
  15. cModule.c1(); //启动子系统三
  16. }
  17. }

上面的代码我们会经常写,自习详细,会存在如下问题:

  • 代码耦合度太高,客户端与子系统中各模块都有关联。一旦子系统有什么更改,会涉及到客户端的修改。
  • 客户端想要知道每个模块中各个方法的含义才能进行调用。

现在采用了外观设计模式,添加一个外观类,由外观重组需要调用的方法

外观抽象类

  1. package FacadePattern;
  2. public interface FacadeApi {
  3. public void a1();
  4. public void b1();
  5. public void c1();
  6. public void test();
  7. }

外观实现类

  1. package FacadePattern.ModuleImpl;
  2. import FacadePattern.FacadeApi;
  3. public class FacadeImpl implements FacadeApi {
  4. public void a1() {
  5. new AModuleImpl().a1();
  6. }
  7. public void b1() {
  8. new BModuleImpl().b1();
  9. }
  10. public void c1() {
  11. new CModuleImpl().c1();
  12. }
  13. public void test() {
  14. a1();
  15. b1();
  16. c1();
  17. }
  18. }

采用了外观设计模式的客户端

  1. package FacadePattern.Test;
  2. import FacadePattern.FacadeApi;
  3. import FacadePattern.ModuleImpl.FacadeImpl;
  4. public class FacadeClient {
  5. public static void main(String[] args) {
  6. FacadeApi facade = new FacadeImpl();
  7. facade.test();
  8. }
  9. }

在test方法中,调用了三个模块中的方法。外观类是在服务端的,不是这客户端。客户端不需要知道具体的内部实现是什么样的。

客户端只需要调用外观模式中的代码即可,不需要关注具体实现细节。


别嫌弃我没写注释,这个代码很简单,注释省略,嘿嘿。

FacadePattern(23种设计模式之一)的更多相关文章

  1. Java开发中的23种设计模式详解

    [放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...

  2. Java开发中的23种设计模式详解(转)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  3. Java开发中的23种设计模式(转)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  4. c#中的23种设计模式

    C# 23种设计模式汇总 创建型模式 工厂方法(Factory Method) 在工厂方法模式中,工厂方法用来创建客户所需要的产品,同时还向客户隐藏了哪种具体产品类将被实例化这一细节.工厂方法模式的核 ...

  5. Java 23种设计模式

    转自: http://zz563143188.iteye.com/blog/1847029 ; i<count; i++){ list.add(new MailSender()); } } pu ...

  6. 从追MM谈Java的23种设计模式(转)

    从追MM谈Java的23种设计模式    这个是从某个文章转载过来的.但是忘了原文链接.如果知道的,我追加一下. 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西 ...

  7. java 23种设计模式及具体例子 收藏有时间慢慢看

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代 码可靠性. 毫无疑问,设计模式 ...

  8. JAVA:23种设计模式详解(转)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  9. 从追MM谈Java的23种设计模式

    从追MM谈Java的23种设计模式 1.FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯 德基,只管向服务员说“来四个鸡 ...

  10. 23种设计模式全解析 (java版本)

    转自:http://blog.csdn.net/longyulu/article/details/9159589 其中PHP常用的五种设计模式分别为:工厂模式,单例模式,观察者模式,策略模式,命令模式 ...

随机推荐

  1. HihoCoder - 1615矩阵游戏II(贪心)

    矩阵游戏II 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个NxN的整数矩阵,小Hi每次操作可以选择两列,将这两列中的所有数变成它的相反数. 小Hi可以进行任意 ...

  2. SSH使用总结(xml配置)

    beans.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="htt ...

  3. UIImage+PYJAnimatedGIF

    UIImage+PYJAnimatedGIF.h: #import <UIKit/UIKit.h> @interface UIImage (PYJAnimatedGIF) + (UIIma ...

  4. LG3628 [APIO2010]特别行动队

    题意 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 n 编号,要将他们拆分 成若干特别行动队调入战场.出于默契的考虑,同一支特别行动队中队员的编号 应该连续,即为形如(i, i + 1, . ...

  5. 开源的UML建模工具

    StarUML 一个开源的UML建模工具 地址:http://staruml.sourceforge.net/en/ 效果图: 出处:http://www.cnblogs.com/zzy0471/ar ...

  6. 调用 Windows 7 中英文混合朗读

    1.windows7内置语音识别 2.文本到语音转换增加了 Microsoft Lili - Chinese(China) ,支持中英文混合朗读 3.女声.部分词组基本发音准确 以上让我有做个小程序的 ...

  7. IIS安装步骤(WIN10)

    打开控制面板 点开程序   点击“启动或关闭Windows功能,进入到启用或关闭windows功能之后我们选中“Internet Infomation Services”并勾选   点击确定     ...

  8. Eclipse 中 No java virtual machine was found... 解决方法

    这个链接说的不错,http://www.mafutian.net/123.html,,但是还有一种可能是64位和32位的问题,也就是eclipse32位只能用32位的jdk,eclipse64位的只能 ...

  9. Vue.js:自定义指令

    ylbtech-Vue.js:自定义指令 1.返回顶部 1. Vue.js 自定义指令 除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令. 下面我们注册一 ...

  10. elasticsearch5.6.8中文分词器

    安装分词器,务必确保版本一致! 下载地址:https://github.com/medcl/elasticsearch-analysis-ik 为了保证一致,我特地将elasticsearch进行降级 ...