组合和外观模式

news2025/2/28 13:00:58

文章目录

  • 组合模式
    • 1.引出组合模式
        • 1.院系展示需求
        • 2.组合模式基本介绍
        • 3.组合模式原理类图
        • 4.解决的问题
    • 2.组合模式解决院系展示
        • 1.类图
        • 2.代码实现
          • 1.AbsOrganizationComponent.java 总体抽象类用于存储信息和定义方法
          • 2.University.java 第一层,University 可以管理 College
          • 3.College.java 第二层,可以管理Department
          • 4.Department.java 最底层,没有操作节点的方法
          • 5.Client.java 从大到小创建对象,从小到大组合树结构
          • 6.结果
    • 3.JDK的HashMap使用了组合模式
  • 外观模式
    • 1.引出外观模式
        • 1.影院管理项目
        • 2.传统方式解决
        • 3.传统方案的问题分析以及解决方式
    • 2.外观模式
        • 1.基本介绍
        • 2.原理类图
        • 3.思路分析
        • 4.类图
        • 5.目录结构
        • 6.代码实现
          • 1.device 子系统层
            • 1.DVDPlayer.java
            • 2.Popcorn.java
            • 3.Projector.java
            • 4.Screen.java
          • 2.appearance 外观层,统一调用子系统
          • 3.Client.java 客户端,直接调用外观层,不关系子系统的具体调用
          • 4.结果
        • 7.注意事项
    • 3.外观模式在MyBatis框架的应用

组合模式

1.引出组合模式

1.院系展示需求

image-20240604191023057

2.组合模式基本介绍

image-20240604191334135

3.组合模式原理类图

image-20240604191719778

4.解决的问题

image-20240604191826484

2.组合模式解决院系展示

1.类图

image-20240604203204704

2.代码实现
1.AbsOrganizationComponent.java 总体抽象类用于存储信息和定义方法
package com.sun;

/**
 * Description: 总体抽象类,也可以是具体类,也可以是接口
 * @Author sun
 * @Create 2024/6/4 19:33
 * @Version 1.0
 */
public abstract class AbsOrganizationComponent {

    private String name;
    private String des;

    public AbsOrganizationComponent(String name, String des) {
        this.name = name;
        this.des = des;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDes() {
        return des;
    }

    public void setDes(String des) {
        this.des = des;
    }


    protected void add(AbsOrganizationComponent absOrganizationComponent) {
        // 方法默认实现,因为叶子节点不需要重写这些方法
        throw new UnsupportedOperationException();
    }

    protected void remove(AbsOrganizationComponent absOrganizationComponent) {
        // 方法默认实现,因为叶子节点不需要重写这些方法
        throw new UnsupportedOperationException();
    }

    // 打印方法三个子类都需要实现
    protected abstract void print();

}
2.University.java 第一层,University 可以管理 College
package com.sun;

import java.util.ArrayList;
import java.util.List;

/**
 * Description: University 可以管理 College
 * @Author sun
 * @Create 2024/6/4 19:39
 * @Version 1.0
 */
public class University extends AbsOrganizationComponent {

    /*
    聚合总体的抽象类,目的是可以管理College
     */
    List<AbsOrganizationComponent> organizationComponents = new ArrayList<AbsOrganizationComponent>();

    public University(String name, String des) {
        super(name, des);
    }

    @Override
    protected void add(AbsOrganizationComponent absOrganizationComponent) {
        organizationComponents.add(absOrganizationComponent);
    }

    @Override
    protected void remove(AbsOrganizationComponent absOrganizationComponent) {
        organizationComponents.remove(absOrganizationComponent);
    }

    /**
     * 重写print方法,打印University和College的名字
     */
    @Override
    protected void print() {
        // 首先打印自己的名字
        System.out.println("--------" + super.getName() + "--------");
        // 遍历list,打印出来College的名字
        for (AbsOrganizationComponent organizationComponent : organizationComponents) {
            organizationComponent.print();
        }
    }

    @Override
    public void setDes(String des) {
        super.setDes(des);
    }

    @Override
    public String getDes() {
        return super.getDes();
    }

    @Override
    public void setName(String name) {
        super.setName(name);
    }

    @Override
    public String getName() {
        return super.getName();
    }
}
3.College.java 第二层,可以管理Department
package com.sun;

import java.util.ArrayList;
import java.util.List;

/**
 * Description: College 可以管理 Department
 * @Author sun
 * @Create 2024/6/4 19:55
 * @Version 1.0
 */
public class College extends AbsOrganizationComponent {

    /*
    聚合总体的抽象类,目的是可以管理Department(专业)
     */
    List<AbsOrganizationComponent> organizationComponents = new ArrayList<AbsOrganizationComponent>();

    public College(String name, String des) {
        super(name, des);
    }

    @Override
    protected void add(AbsOrganizationComponent absOrganizationComponent) {
        organizationComponents.add(absOrganizationComponent);
    }

    @Override
    protected void remove(AbsOrganizationComponent absOrganizationComponent) {
        organizationComponents.remove(absOrganizationComponent);
    }

    /**
     * 重写print方法,打印College和Department的名字
     */
    @Override
    protected void print() {
        // 首先打印自己的名字
        System.out.println("--------" + super.getName() + "--------");
        // 遍历list,打印出来College的名字
        for (AbsOrganizationComponent organizationComponent : organizationComponents) {
            System.out.println("--------" + organizationComponent.getName() + "--------");
        }
    }

    @Override
    public void setDes(String des) {
        super.setDes(des);
    }

    @Override
    public String getDes() {
        return super.getDes();
    }

    @Override
    public void setName(String name) {
        super.setName(name);
    }

    @Override
    public String getName() {
        return super.getName();
    }
}
4.Department.java 最底层,没有操作节点的方法
package com.sun;

/**
 * Description: Department是最底层的叶子节点,只有打印逻辑,没有add和remove,因为叶子节点不需要管理其他节点了
 * @Author sun
 * @Create 2024/6/4 20:03
 * @Version 1.0
 */
public class Department extends AbsOrganizationComponent {

    public Department(String name, String des) {
        super(name, des);
    }

    protected void print() {
        // 这里并没有其他的集合,所以就输出自己的名字即可
        System.out.println("叶子节点:" + getName());
    }

    @Override
    public void setDes(String des) {
        super.setDes(des);
    }

    @Override
    public String getDes() {
        return super.getDes();
    }

    @Override
    public void setName(String name) {
        super.setName(name);
    }

    @Override
    public String getName() {
        return super.getName();
    }
}
5.Client.java 从大到小创建对象,从小到大组合树结构
package com.sun;

/**
 * Description:
 * @Author sun
 * @Create 2024/6/4 20:09
 * @Version 1.0
 */
public class Client {
    public static void main(String[] args) {
        // 从大到小创建对象,从小到大组合成树

        // 创建学校
        University university = new University("清华", "niubi");

        // 创建学院
        College computer = new College("计算机学院", "培养计算机人才的");
        College infoEngineer = new College("信息工程学院", "培养信息工程人才的");

        // 创建专业,并开始组合
        computer.add(new Department("网络安全", "网安"));
        computer.add(new Department("软件工程", "软工"));
        computer.add(new Department("计算机科学与技术", "计科"));
        infoEngineer.add(new Department("通信工程", "通信工程不好学"));
        infoEngineer.add(new Department("信息工程", "信息工程不好学"));

        // 将学院加入到学校中
        university.add(computer);
        university.add(infoEngineer);

        // 打印全部
        university.print();
    }
}
6.结果

image-20240604203529233

3.JDK的HashMap使用了组合模式

image-20240604204136380

外观模式

1.引出外观模式

1.影院管理项目

image-20240605191327104

2.传统方式解决

image-20240605191401562

3.传统方案的问题分析以及解决方式

image-20240605191617332

2.外观模式

1.基本介绍

image-20240605191822067

2.原理类图

image-20240605192317174

3.思路分析

image-20240605192426489

4.类图

image-20240605200530563

5.目录结构

image-20240605200549692

6.代码实现
1.device 子系统层
1.DVDPlayer.java
package com.sun.device;

/**
 * Description: 一个播放器
 * @Author sun
 * @Create 2024/6/5 19:27
 * @Version 1.0
 */
public class DVDPlayer {

    // 使用饿汉式的单例模式
    private static DVDPlayer instance = new DVDPlayer();

    public static DVDPlayer getInstance() {
        return instance;
    }

    // 一些方法
    public void on() {
        System.out.println("DVD on");
    }
    public void off() {
        System.out.println("DVD off");
    }
    public void play() {
        System.out.println("DVD is playing");
    }
}
2.Popcorn.java
package com.sun.device;

/**
 * Description: 爆米花机
 * @Author sun
 * @Create 2024/6/5 19:30
 * @Version 1.0
 */
public class Popcorn {

    // 使用饿汉式的单例模式
    private static Popcorn instance = new Popcorn();

    public static Popcorn getInstance() {
        return instance;
    }

    // 一些方法
    public void on() {
        System.out.println("Popcorn on");
    }
    public void off() {
        System.out.println("Popcorn off");
    }
    public void pop() {
        System.out.println("Popcorn is poping");
    }
}
3.Projector.java
package com.sun.device;

/**
 * Description: 投影仪
 * @Author sun
 * @Create 2024/6/5 19:31
 * @Version 1.0
 */
public class Projector {

    // 使用饿汉式的单例模式
    private static Projector instance = new Projector();

    public static Projector getInstance() {
        return instance;
    }

    // 一些方法
    public void on() {
        System.out.println("Projector on");
    }
    public void off() {
        System.out.println("Projector off");
    }
    public void focus() {
        System.out.println("Projector is focusing");
    }
}
4.Screen.java
package com.sun.device;

/**
 * Description: 屏幕
 * @Author sun
 * @Create 2024/6/5 19:34
 * @Version 1.0
 */
public class Screen {

    // 使用饿汉式的单例模式
    private static Screen instance = new Screen();

    public static Screen getInstance() {
        return instance;
    }

    // 一些方法
    public void up() {
        System.out.println("Screen up");
    }
    public void down() {
        System.out.println("Screen down");
    }
}
2.appearance 外观层,统一调用子系统
package com.sun.appearance;

import com.sun.device.DVDPlayer;
import com.sun.device.Popcorn;
import com.sun.device.Projector;
import com.sun.device.Screen;

/**
 * Description: 未使用外观模式的调用方式
 * @Author sun
 * @Create 2024/6/5 19:44
 * @Version 1.0
 */
public class HomeTheaterFacade {

    // 定义各个子系统的对象
    private DVDPlayer dvdPlayer;
    private Popcorn popcorn;
    private Projector projector;
    private Screen screen;

    public HomeTheaterFacade() {
        this.dvdPlayer = DVDPlayer.getInstance();
        this.popcorn = Popcorn.getInstance();
        this.projector = Projector.getInstance();
        this.screen = Screen.getInstance();
    }

    // 操作分为3步
    // 1、准备阶段
    public void ready() {
        dvdPlayer.on();
        popcorn.on();
        projector.on();
        screen.up();
    }
    // 2、播放
    public void play() {
        dvdPlayer.play();
    }
    // 3、关闭
    public void shutdown() {
        dvdPlayer.off();
        popcorn.off();
        projector.off();
        screen.down();
    }

}
3.Client.java 客户端,直接调用外观层,不关系子系统的具体调用
package com.sun;

import com.sun.appearance.HomeTheaterFacade;

/**
 * Description: Client
 * @Author sun
 * @Create 2024/6/5 19:53
 * @Version 1.0
 */
public class Client {
    public static void main(String[] args) {
        HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade();
        homeTheaterFacade.ready();
        homeTheaterFacade.play();
        homeTheaterFacade.shutdown();
    }
}
4.结果

image-20240605200842215

7.注意事项

image-20240605202400132

3.外观模式在MyBatis框架的应用

image-20240605200922262

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1823325.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

atcoder ABC 355-C题详解

atcoder ABC 355-C题详解 ​ Problem Statement There is an NN grid, where the cell at the i-th row from the top and the j-th column from the left contains the integer N(i−1)j. Over T turns, integers will be announced. On Turn i, the integer Ai​ is anno…

C++入门8 构造函数析构函数顺序|拷贝构造

一&#xff0c;构造函数析构函数 调用顺序 我们先来看下面的代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring> using namespace std; class student { public:char my_name[20];int my_id;student(int a) {my_id a;co…

使用超声波麦克风阵列预测数控机床刀具磨损

预测性维护是使用传感器数据来推断机器状态&#xff0c;并从这些传感器数据中检测出在故障发生之前存在的缺陷或故障的过程。预测性维护在所有工业领域都是一种日益增长的趋势&#xff0c;包括轴承故障检测、齿轮磨损检测或往复式机器中的活塞磨损等许多其他例子。在预测性维护…

ADS基础教程20 - 电磁仿真(EM)参数化

EM介绍 一、引言二、参数化设置1.参数定义2.参数赋值3.创建EM模型和符号 四、总结 一、引言 参数化EM仿真&#xff0c;是在Layout环境下创建参数&#xff0c;相当于在原理图中声明变量。 二、参数化设置 1.参数定义 1&#xff09;在Layout视图&#xff0c;菜单栏中选中EM&g…

哈喽GPT-4o——对GPT-4o 写论文的思考与看法

目录 几小时即可完成一份1万字论文的编写1、改写降重2、同义词替换降重3、避免连续相同4、缩写扩写降重5、关键词汇替换降重6、句式变换降重7、逻辑重组8、综合改写9、数据呈现方式变更10、概念解释降重 大家好&#xff0c;我是哪吒。 在ChatGPT4o对话框中输入&#xff1a;写一…

继承-进阶-易错点

子类同名方法隐藏父类方法 即使调用不匹配也不会再去父类寻找&#xff0c;而是直接报错 //下面代码输出结果&#xff1a;( )&#xfeff;class A { public:void f(){ cout<<"A::f()"<<endl; }int a; };class B : public A { public:void f(int a){c…

若依微服务Docker部署验证码出不来怎么办?

最近,有许多人反馈在使用 Docker 部署若依微服务项目时,遇到验证码无法显示的问题。本文将重点介绍解决该问题的注意事项以及整个项目的部署流程。之前我们也撰写过微服务部署教程,本文将在此基础上进行优化和补充。你也可以参考我之前写的部署教程:https://yang-roc.blog.…

做材料科学领域研究热点:高通量多尺度材料计算和机器学习

研究背景 材料科学是一个重要领域&#xff0c;涉及物质的研究和利用。随着科技进步&#xff0c;材料学已成为多学科交叉的前沿领域之一&#xff0c;融合物理、化学、数学、信息、力学和计算科学等知识。寻找更坚固的新材料已成为当今急需解决的问题。 材料基因工程作为一项颠覆…

万相台的功能是什么?如何使用万相台?

1.特点&#xff1a; 万相台是一个智能渠道&#xff0c;可控性弱&#xff0c;高转化&#xff0c;人群&关键词是黑盒&#xff1b; 2.场景多&#xff1a; 有拉新快、活动加速、上新快、货品加速、活动加速、多目标直投、全站推等&#xff1b; 3.扣费逻辑&#xff1a;cpc付…

Elasticsearch:简化数据流的数据生命周期管理

作者&#xff1a;来自 Elastic Andrei Dan 今天&#xff0c;我们将探索 Elasticsearch 针对数据流的新数据管理系统&#xff1a;数据流生命周期&#xff0c;从版本 8.14 开始提供。凭借其简单而强大的执行模型&#xff0c;数据流生命周期可让n 你专注于数据生命周期的业务相关方…

动态规划-简单多状态dp问题 -- 按摩师

动态规划-简单多状态dp问题 – 按摩师 文章目录 动态规划-简单多状态dp问题 -- 按摩师题目重现算法流程示例代码 题目重现 题目链接&#xff1a;按摩师 - 力扣 一个有名的按摩师会收到源源不断的预约请求&#xff0c;每个预约都可以选择接或不接。在每次预约服务之间要有休息时…

Linux网络编程:多路转接|select|poll

目录 前言&#xff1a; 1.IO多路转接---select 1.1.接口认识 1.2.select如何进行多路转接 1.3.select多路转接的优缺点 2.IO多路转接---poll 2.1.接口认识 2.2.poll如何进行多路转接 2.3.poll多路转接优缺点 前言&#xff1a; 多路转接&#xff08;也称为IO多路复用&a…

留住马斯克和AI,股价连续大涨,但特斯拉还是贵?

留住马斯克和AI&#xff0c;股价连续大涨&#xff0c;但特斯拉还是贵&#xff1f; 特斯拉股东们花了560亿美元留住马斯克&#xff0c;但特斯拉的前景依旧迷雾重重&#xff0c;估值比一众科技巨头贵&#xff0c;汽车一季度销量疲弱&#xff0c;股价今年来累计下跌29%&#xff0…

mysql导入sql文件失败及解决措施

1.报错找不到表 1.1 原因 表格创建失败&#xff0c;编码问题mysql8相较于mysql5出现了新的编码集 1.2解决办法&#xff1a; 使用vscode打开sql文件ctrlh&#xff0c;批量替换&#xff0c;替换到你所安装mysql支持的编码集。 2.timestmp没有设置默认值 Error occured at:20…

LangChain入门学习笔记(三)—— Model I/O之Prompts

如果说LCEL是粘合剂&#xff0c;那么它需要粘合起来的要素就是各种组件。其中最核心的要素就是LangChain官方文档中定义的Model I/O&#xff1a;Prompts、Chat Models、LLMs和Output Parsers。这4个基本组件&#xff0c;可以处理基本的用户输入并通过大模型处理后按要求输出。 …

SpringBoot的Mybatis-plus实战之核心功能

文章目录 一、条件构造器二、自定义SQL第一步、基于wrapper构建where条件第二步、在mapper中声明变量名称第三步、自定义SQL 本篇继续MybatisPlus核心功能 一、条件构造器 MybatisPlus 支持各种复杂的where条件&#xff0c;可满足日常开发的所有需求。 使用到wrapper构造器&am…

代理服务

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在爬取网页的过程中&#xff0c;经常会出现不久前可以爬取的网页现在无法爬取了&#xff0c;这是因为您的IP被爬取网站的服务器所屏蔽了。此时代理服…

银河麒麟系统安装

新建虚拟机 选择典型下一步&#xff1a; 稍后安装操作系统 下一步 &#xff1a; 选择Linux Ubuntu 64位 下一步&#xff1a; 设置名称 选择一个虚拟机的位置进行下一步&#xff1a; 磁盘大小默认给20G 下一步&#xff1a; 点击完成 编辑虚拟机设置 点击CD/DVD(SATA) 使用IS…

27.设计注入功能界面

上一个内容&#xff1a;26.入口点注入项目搭建 使用 26.入口点注入项目搭建 它的代码为基础进行修改 效果图&#xff1a; 首先设置一些主窗口的边框属性 然后在IDD_PAGE_0里添加一个List Control 再给List Control设置调整大小类型属性 然后再给它添加一个变量 然后在拖入一个…

Linux 线程控制

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux初窥门径⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 1.线程现象 2.线程等待 3.线程…