23种设计模式_MODE09外观模式_手写代码实现

简介: 23种设计模式_MODE09外观模式_手写代码实现

1.外观模式测试

package com.zhaoshuangjian.mode09_外观模式;
import com.zhaoshuangjian.mode09_外观模式.mode09.FacadeAB;
import com.zhaoshuangjian.mode09_外观模式.mode09.ModuleA.FacadeA;
import com.zhaoshuangjian.mode09_外观模式.mode09.ModuleA.SubSystemA;
import com.zhaoshuangjian.mode09_外观模式.mode09.ModuleA.SubSystemB;
import com.zhaoshuangjian.mode09_外观模式.mode09.ModuleB.FacadeB;
import com.zhaoshuangjian.mode09_外观模式.mode09.ModuleB.SubSystemC;
import com.zhaoshuangjian.mode09_外观模式.mode09.ModuleB.SubSystemD;
/**
 * <p>外观模式测试</p>
 *
 * @Author zhaoshuangjian  2023-03-25 上午10:39
 */
public class FacadeTest {
    public static void main(String[] args) {
        /**
         * 不使用外观模式,直接使用智能人工系统的模块A和模块B的功能
         * 缺点:用户必须清楚模块中的各个子系统的工作流程,否则会导致系统的不正常工作
         */
        useModuleA();
        useModuleB();
        /**
         * 使用外观模式A和外观模式B
         * 缺点:依然不够简洁
         */
        useModuleAByFacadeA();
        useModuleAByFacadeB();
        /**
         * 使用外观模式AB
         * 优点:用户使用系统,相当的便捷,没有多余的废话
         */
        useSystemByFacadeAB();
        /**
         * 通过以上的对比,想必大家已经知道了什么时候该用外观模式,什么时候直接调用子模块
         * 另外插一句:装饰模式、代理模式以及刚刚才学到的外观模式,其模板就是参照的对象适配器来着的
         * 因此,你会有种似曾相识的感觉
         * 设计模式不是一天两天就能悟的透的,它是一个长期而漫长的过程
         * 一旦你领悟到其中的门道,开发项目+写代码将会是一门艺术
         */
    }
    /**
     * 不使用外观模式,直接使用模块A的功能
     */
    private static void useModuleA(){
        partition("直接使用模块A中的功能");
        SubSystemA subSystemA = new SubSystemA();
        SubSystemB subSystemB = new SubSystemB();
        subSystemA.initSystem();
        subSystemB.loadDatas();
    }
    /**
     * 不使用外观模式,直接使用模块B的功能
     */
    private static void useModuleB(){
        partition("直接使用模块B中的功能");
        SubSystemC subSystemC = new SubSystemC();
        SubSystemD subSystemD = new SubSystemD();
        subSystemC.sayHello();
        subSystemD.working();
    }
    /**
     * 使用外观模式A,对模块A中的功能进行"屏蔽"
     */
    private static void useModuleAByFacadeA(){
        partition("使用外观模式A");
        FacadeA facadeA = new FacadeA();
        facadeA.initialize();
    }
    /**
     * 使用外观模式B,对模块B中的功能进行"屏蔽"
     */
    private static void useModuleAByFacadeB(){
        partition("使用外观模式A");
        FacadeB facadeB = new FacadeB();
        facadeB.work();
    }
    /**
     * 使用外观模式AB,对外观模式A和B再进行一次"屏蔽"
     */
    private static void useSystemByFacadeAB(){
        partition("使用外观模式AB");
        FacadeAB facadeAB = new FacadeAB();
        facadeAB.startSystem();
    }
    private static  void partition(String note){
        System.out.println("============== 分割线【"+note+"】 ==============");
    }
}

2.外观模式AB == 聚合子模块A和子模块B的功能,降低客户端使用模块A和模块B的复杂度


package com.zhaoshuangjian.mode09_外观模式.mode09;
import com.zhaoshuangjian.mode09_外观模式.mode09.ModuleA.FacadeA;
import com.zhaoshuangjian.mode09_外观模式.mode09.ModuleB.FacadeB;
/**
 * <p>外观模式AB == 聚合子模块A和子模块B的功能,降低客户端使用模块A和模块B的复杂度</p>
 *
 * @Author zhaoshuangjian  2023-03-25 上午10:39
 */
public class FacadeAB {
    private FacadeA facadeA;
    private FacadeB facadeB;
    public  FacadeAB(){
        facadeA = new FacadeA();
        facadeB = new FacadeB();
    }
    public void  startSystem(){
        facadeA.initialize();
        facadeB.work();
    }
}

3.外观模式A == 聚合子模块A中的子系统A和B,降低客户端操作子模块A的复杂度

package com.zhaoshuangjian.mode09_外观模式.mode09.ModuleA;
/**
 * <p>外观模式A == 聚合子模块A中的子系统A和B,降低客户端操作子模块A的复杂度</p>
 *
 * @Author zhaoshuangjian  2023-03-25 上午10:39
 */
public class FacadeA {
    private SubSystemA subSystemA;
    private SubSystemB subSystemB;
    public  FacadeA(){
        subSystemA = new SubSystemA();
        subSystemB = new SubSystemB();
    }
    /**
     * 将模块A的功能封装一下,松散客户端与A模块中的各个子系统间的耦合关系
     * 让模块中的各个子系统更容易扩展和维护
     */
    public void initialize(){
        subSystemA.initSystem();
        subSystemB.loadDatas();
    }
}

4.模块A下的子系统A

package com.zhaoshuangjian.mode09_外观模式.mode09.ModuleA;
/**
 * <p>模块A下的子系统A</p>
 *
 * @Author zhaoshuangjian  2023-03-25 上午10:39
 */
public class SubSystemA {
    public void initSystem(){
        System.out.println("人工智能系统正在启动,请您稍等.... =====>"+this);
        for(int i = 0; i < 3; i++){
            try {
                System.out.println("等待"+(i+1)+"s");
                Thread.sleep(1000);
            }catch (InterruptedException ex){
                System.out.println(ex.getClass()+","+ ex.getMessage());
            }
        }
    }
    @Override
    public String toString(){
        return "人工智能系统,模块A,子系统A,主要负责启动系统";
    }
}

5.模块A下的子系统B

package com.zhaoshuangjian.mode09_外观模式.mode09.ModuleA;
/**
 * <p>模块A下的子系统B</p>
 *
 * @Author zhaoshuangjian  2023-03-25 上午10:39
 */
public class SubSystemB {
    public void loadDatas(){
        System.out.println("人工智能系统已经启动,正在加载数据 =====>"+this);
        System.out.println(".........");
        System.out.println("数据已完成加载");
    }
    @Override
    public String toString(){
        return "人工智能系统,模块A,子系统B,主要负责加载数据";
    }
}

6.外观模式B == 聚合子模块B中的子系统C和D,降低客户端操作子模块B的复杂度

package com.zhaoshuangjian.mode09_外观模式.mode09.ModuleB;
/**
 * <p>外观模式B == 聚合子模块B中的子系统C和D,降低客户端操作子模块B的复杂度</p>
 *
 * @Author zhaoshuangjian  2023-03-25 上午10:39
 */
public class FacadeB {
    private SubSystemC subSystemC;
    private SubSystemD subSystemD;
    public FacadeB(){
        subSystemC = new SubSystemC();
        subSystemD = new SubSystemD();
    }
    /**
     * 将模块A的功能封装一下,松散客户端与A模块中的各个子系统间的耦合关系
     * 让模块中的各个子系统更容易扩展和维护
     */
    public void work(){
        subSystemC.sayHello();
        subSystemD.working();
    }
}

7.模块B下的子系统C

package com.zhaoshuangjian.mode09_外观模式.mode09.ModuleB;
/**
 * <p>模块B下的子系统C</p>
 *
 * @Author zhaoshuangjian  2023-03-25 上午10:39
 */
public class SubSystemC {
    public void sayHello(){
        System.out.println("欢迎进入Appleyk's 基于电影知识图谱的人工智能系统 =====>"+this);
        System.out.println("关于系统的介绍请参考博文:https://blog.csdn.net/Appleyk/article/details/80422055");
    }
    @Override
    public String toString(){
        return "人工智能系统,模块B,子系统C,欢迎界面";
    }
}

8.模块B下的子系统D

package com.zhaoshuangjian.mode09_外观模式.mode09.ModuleB;
/**
 * <p>模块B下的子系统D</p>
 *
 * @Author zhaoshuangjian  2023-03-25 上午10:39
 */
public class SubSystemD {
    public void working(){
        System.out.println("亲爱的用户,以下是你18年截止到今天看的电影的大数据统计结果:=====>"+this);
        System.out.println("《《《《 ========== 》》》》》\n爱情动作片:10次\n" +
                "恐怖片:1次\n" +
                "喜剧片:6次\n" +
                "总花费:680.5元\n" +
                "《《《《 ========== 》》》》》");
    }
    @Override
    public String toString(){
        return "人工智能系统,模块B,子系统D,开始工作";
    }
}





相关文章
|
1月前
|
设计模式 缓存 应用服务中间件
「全网最细 + 实战源码案例」设计模式——外观模式
外观模式(Facade Pattern)是一种结构型设计模式,旨在为复杂的子系统提供一个统一且简化的接口。通过封装多个子系统的复杂性,外观模式使外部调用更加简单、易用。例如,在智能家居系统中,外观类可以同时控制空调、灯光和电视的开关,而用户只需发出一个指令即可。
140 69
|
4月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性和扩展性
【10月更文挑战第13天】 本文将探讨PHP中常见的设计模式及其在实际项目中的应用。通过对比传统编程方式,我们将展示设计模式如何有效地提高代码的可维护性和扩展性。无论是单例模式确保类的单一实例,还是观察者模式实现对象间的松耦合,每一种设计模式都为开发者提供了解决特定问题的最佳实践。阅读本文后,读者将能更好地理解和应用这些设计模式,从而提升PHP编程的效率和质量。
|
4月前
|
设计模式 Java
Java设计模式之外观模式
这篇文章详细解释了Java设计模式之外观模式的原理及其应用场景,并通过具体代码示例展示了如何通过外观模式简化子系统的使用。
47 0
|
4月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
5月前
|
设计模式 算法 PHP
PHP中的设计模式:提升代码的灵活性与可维护性
在本文中,我们将深入探讨PHP编程语言中的一种重要概念——设计模式。设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。它代表了最佳的实践,被有经验的面向对象的软件开发人员所采用。本文将通过具体的实例,展示如何在PHP项目中应用设计模式,以提高代码的灵活性和可维护性。无论你是PHP初学者还是经验丰富的开发者,都能从中获得有价值的见解。
|
5月前
|
设计模式 存储 数据库连接
探索PHP中的设计模式:提高代码的可维护性与扩展性
本文将深入探讨PHP中常用的设计模式,包括单例模式、工厂模式和观察者模式。通过具体的代码示例,展示如何在实际项目中应用这些设计模式,以提高代码的可维护性与扩展性。无论你是PHP初学者还是有一定经验的开发者,都可以通过本文的学习,提升你的编程技巧和项目架构能力。
|
5月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
5月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入探索与实践在软件开发的广袤天地中,PHP以其独特的魅力和强大的功能,成为无数开发者手中的得力工具。而在这条充满挑战与机遇的征途上,设计模式犹如一盏明灯,指引着我们穿越代码的迷雾,编写出更加高效、灵活且易于维护的程序。今天,就让我们聚焦于设计模式中的璀璨明珠——策略模式,深入探讨其在PHP中的实现方法及其实际应用价值。
策略模式,这一设计模式的核心在于它为软件设计带来了一种全新的视角和方法。它允许我们在运行时根据不同情况选择最适合的解决方案,从而极大地提高了程序的灵活性和可扩展性。在PHP这门广泛应用的编程语言中,策略模式同样大放异彩,为开发者们提供了丰富的创作空间。本文将从策略模式的基本概念入手,逐步深入到PHP中的实现细节,并通过一个具体的实例来展示其在实际项目中的应用效果。我们还将探讨策略模式的优势以及在实际应用中可能遇到的挑战和解决方案,为PHP开发者提供一份宝贵的参考。
|
5月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性
设计模式在PHP开发中至关重要,如单例模式确保类仅有一个实例并提供全局访问点,适用于管理数据库连接或日志记录。工厂模式封装对象创建过程,降低系统耦合度;策略模式定义算法系列并使其可互换,便于实现不同算法间的切换。合理选择设计模式需基于需求分析,考虑系统架构,并通过测试驱动开发验证有效性,确保团队协作一致性和代码持续优化。设计模式能显著提升代码质量,解决开发中的设计难题。
48 8
|
5月前
|
设计模式 存储 算法
PHP中的设计模式:策略模式的深入解析与应用在软件开发的浩瀚海洋中,PHP以其独特的魅力和强大的功能吸引了无数开发者。作为一门历史悠久且广泛应用的编程语言,PHP不仅拥有丰富的内置函数和扩展库,还支持面向对象编程(OOP),为开发者提供了灵活而强大的工具集。在PHP的众多特性中,设计模式的应用尤为引人注目,它们如同精雕细琢的宝石,镶嵌在代码的肌理之中,让程序更加优雅、高效且易于维护。今天,我们就来深入探讨PHP中使用频率颇高的一种设计模式——策略模式。
本文旨在深入探讨PHP中的策略模式,从定义到实现,再到应用场景,全面剖析其在PHP编程中的应用价值。策略模式作为一种行为型设计模式,允许在运行时根据不同情况选择不同的算法或行为,极大地提高了代码的灵活性和可维护性。通过实例分析,本文将展示如何在PHP项目中有效利用策略模式来解决实际问题,并提升代码质量。

热门文章

最新文章