组合和外观模式

组合模式

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

相关推荐

  1. 解释组合模式外观模式

    2024-06-14 22:34:02       38 阅读
  2. 【设计模式外观模式

    2024-06-14 22:34:02       55 阅读
  3. 设计模式——外观模式

    2024-06-14 22:34:02       47 阅读
  4. 设计模式-外观模式

    2024-06-14 22:34:02       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-14 22:34:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-14 22:34:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-14 22:34:02       82 阅读
  4. Python语言-面向对象

    2024-06-14 22:34:02       91 阅读

热门阅读

  1. GlideApp无法生成问题解决

    2024-06-14 22:34:02       33 阅读
  2. 深入解析JVM的GC过程

    2024-06-14 22:34:02       31 阅读
  3. cocos入门11:生命周期

    2024-06-14 22:34:02       29 阅读
  4. Docker相关命令

    2024-06-14 22:34:02       27 阅读