组合和外观模式

2024-06-15 01:04
文章标签 组合 模式 外观

本文主要是介绍组合和外观模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 组合模式
    • 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);}@Overrideprotected void add(AbsOrganizationComponent absOrganizationComponent) {organizationComponents.add(absOrganizationComponent);}@Overrideprotected void remove(AbsOrganizationComponent absOrganizationComponent) {organizationComponents.remove(absOrganizationComponent);}/*** 重写print方法,打印University和College的名字*/@Overrideprotected void print() {// 首先打印自己的名字System.out.println("--------" + super.getName() + "--------");// 遍历list,打印出来College的名字for (AbsOrganizationComponent organizationComponent : organizationComponents) {organizationComponent.print();}}@Overridepublic void setDes(String des) {super.setDes(des);}@Overridepublic String getDes() {return super.getDes();}@Overridepublic void setName(String name) {super.setName(name);}@Overridepublic 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);}@Overrideprotected void add(AbsOrganizationComponent absOrganizationComponent) {organizationComponents.add(absOrganizationComponent);}@Overrideprotected void remove(AbsOrganizationComponent absOrganizationComponent) {organizationComponents.remove(absOrganizationComponent);}/*** 重写print方法,打印College和Department的名字*/@Overrideprotected void print() {// 首先打印自己的名字System.out.println("--------" + super.getName() + "--------");// 遍历list,打印出来College的名字for (AbsOrganizationComponent organizationComponent : organizationComponents) {System.out.println("--------" + organizationComponent.getName() + "--------");}}@Overridepublic void setDes(String des) {super.setDes(des);}@Overridepublic String getDes() {return super.getDes();}@Overridepublic void setName(String name) {super.setName(name);}@Overridepublic 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());}@Overridepublic void setDes(String des) {super.setDes(des);}@Overridepublic String getDes() {return super.getDes();}@Overridepublic void setName(String name) {super.setName(name);}@Overridepublic 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.chinasem.cn/article/1061993

相关文章

hdu4869(逆元+求组合数)

//输入n,m,n表示翻牌的次数,m表示牌的数目,求经过n次操作后共有几种状态#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#includ

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

springboot实战学习(1)(开发模式与环境)

目录 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 (3)前端 二、开发模式 一、实战学习的引言 (1)前后端的大致学习模块 (2)后端 Validation:做参数校验Mybatis:做数据库的操作Redis:做缓存Junit:单元测试项目部署:springboot项目部署相关的知识 (3)前端 Vite:Vue项目的脚手架Router:路由Pina:状态管理Eleme

状态模式state

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/state 在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。 在状态模式中,player.getState()获取的是player的当前状态,通常是一个实现了状态接口的对象。 onPlay()是状态模式中定义的一个方法,不同状态下(例如“正在播放”、“暂停

软件架构模式:5 分钟阅读

原文: https://orkhanscience.medium.com/software-architecture-patterns-5-mins-read-e9e3c8eb47d2 软件架构模式:5 分钟阅读 当有人潜入软件工程世界时,有一天他需要学习软件架构模式的基础知识。当我刚接触编码时,我不知道从哪里获得简要介绍现有架构模式的资源,这样它就不会太详细和混乱,而是非常抽象和易