19、设计模式应用举例:桥接模式:制作电视节目

本文以中央电视台CCTV5和CCTV6制作体育与电影节目的需求为例,运用桥接模式解耦频道抽象(CCTV、CCTV5、CCTV6)与节目实现(Program、AthleticProgram、FilmProgram),实现抽象与实现的分离,提升系统扩展性与可维护性。

目录

一、关于桥接模式

二、设计要求

三、设计实现

1.抽象

2.实现者

3.细化抽象

4.具体实现者

四、应用程序

五、执行结果


一、关于桥接模式

设计模式:19、桥接模式-优快云博客

二、设计要求

        中央电视台有许多频道,比如CCTV5负责制作体育节目,CCTV6负责制作电影节目。CCTV类是抽象类,定义了一个抽象方法:makeProgram()。请使用桥接模式,将抽象和它的实现分离。

三、设计实现

        

1.抽象

CCTV.java

package xyz.jangle.design.app.bridge;

import javax.swing.JPanel;

/**
 * 抽象
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2026年10月22日 上午10:06:42
 * 
 */
public abstract class CCTV extends JPanel {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	Program programMaker;
	
	public abstract void makeProgram();
}
2.实现者

Program.java

package xyz.jangle.design.app.bridge;

import java.util.ArrayList;

/**
 * 实现者
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2026年10月22日 上午10:07:40
 * 
 */
public interface Program {
	
	ArrayList<String> makeTVProgram();

}
3.细化抽象

CCTV5.java

package xyz.jangle.design.app.bridge;

import java.awt.BorderLayout;
import java.awt.Font;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;

import javax.swing.JLabel;

/**
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2026年10月22日 上午10:11:38
 * 
 */
public class CCTV5 extends CCTV implements Runnable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 469126716384759424L;
	JLabel showFilm;
	Thread thread;
	ArrayList<String> content;
	
	public CCTV5(Program program) {
		this.programMaker = program;
		setLayout(new BorderLayout());
		showFilm = new JLabel("CCTV5 体育频道");
		showFilm.setFont(new Font("",Font.BOLD,39));
		add(showFilm,BorderLayout.CENTER);
		thread = new Thread(this);
	}

	@Override
	public void makeProgram() {
		content = programMaker.makeTVProgram();
		if(!thread.isAlive()) {
			thread = new Thread(this);
			thread.start();
		}
	}

	@Override
	public void run() {
		for (int i = 0; i < content.size(); i++) {
			showFilm.setText(content.get(i));
			try {
				TimeUnit.MILLISECONDS.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}

CCTV6.java

package xyz.jangle.design.app.bridge;

import java.awt.BorderLayout;
import java.awt.Font;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;

import javax.swing.JLabel;

/**
 * 细化抽象
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2026年10月22日 上午10:11:38
 * 
 */
public class CCTV6 extends CCTV implements Runnable{
	/**
	 * 
	 */
	private static final long serialVersionUID = -8617593741113328113L;
	JLabel showFilm;
	Thread thread;
	ArrayList<String> content;
	
	public CCTV6(Program program) {
		this.programMaker = program;
		setLayout(new BorderLayout());
		showFilm = new JLabel("CCTV6 电影频道");
		showFilm.setFont(new Font("",Font.BOLD,39));
		add(showFilm,BorderLayout.CENTER);
		thread = new Thread(this);
	}

	@Override
	public void makeProgram() {
		content = programMaker.makeTVProgram();
		if(!thread.isAlive()) {
			thread = new Thread(this);
			thread.start();
		}
	}

	@Override
	public void run() {
		for (int i = 0; i < content.size(); i++) {
			showFilm.setText(content.get(i));
			try {
				TimeUnit.MILLISECONDS.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}
4.具体实现者

AthleticProgram.java

package xyz.jangle.design.app.bridge;

import java.util.ArrayList;

/**
 * 具体实现者
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2026年10月22日 上午10:22:49
 * 
 */
public class AthleticProgram implements Program {
	
	ArrayList<String> content;
	
	public AthleticProgram() {
		content = new ArrayList<String>();
	}

	@Override
	public ArrayList<String> makeTVProgram() {
		content.clear();
		content.add("足球直播");
		content.add("巴西足球队进场");
		content.add("阿根廷足球队进场");
		content.add("巴西足球队进球");
		content.add("比赛结束");
		return content;
	}

}

FilmProgram.java

package xyz.jangle.design.app.bridge;

import java.util.ArrayList;

/**
 * 具体实现者
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2026年10月22日 上午10:22:49
 * 
 */
public class FilmProgram implements Program {
	
	ArrayList<String> content;
	
	public FilmProgram() {
		content = new ArrayList<String>();
	}

	@Override
	public ArrayList<String> makeTVProgram() {
		content.clear();
		content.add("地道战");
		content.add("1937年鬼子侵略华北");
		content.add("八路军带领民兵展开地道战");
		content.add("把鬼子打地找不着北");
		content.add("鬼子最后被消灭了");
		return content;
	}
	
}

四、应用程序

package xyz.jangle.design.app.bridge;

import java.awt.BorderLayout;
import java.awt.HeadlessException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

/**
 * 桥接模式
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2026年10月22日 上午10:29:31
 * 
 */
public class Application extends JFrame {
	/**
	 * 
	 */
	private static final long serialVersionUID = -7509941715678152534L;
	
	JButton seeProgram;
	CCTV cctv;
	Program program;
	

	public Application(CCTV cctv, Program program) throws HeadlessException {
		super();
		this.cctv = cctv;
		this.program = program;
		add(cctv,BorderLayout.CENTER);
		seeProgram = new JButton("看节目");
		add(seeProgram,BorderLayout.SOUTH);
		seeProgram.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				cctv.makeProgram();
			}
		});
		setVisible(true);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		
	}


	public static void main(String[] args) {
		Program program = new AthleticProgram();
		CCTV cctv = new CCTV5(program);
		Application application = new Application(cctv, program);
		application.setBounds(10, 10, 200, 300);
		program = new FilmProgram();
		cctv = new CCTV6(program);
		Application application2 = new Application(cctv, program);
		application2.setBounds(220, 10, 200, 300);
	}

}

五、执行结果

附训练好的 YOLO 权重与 PyQt 可视化检测界面,页面底部含可视化效果预览,毕设/课设开箱即用。 【数据集概况】 · 检测类别(中文):[未获取()] 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 55 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9512** mAP50-95 | 0.6746 Precision | 0.8796 Recall | 0.8825 train/box_loss | 0.8608 train/cls_loss | 0.7232 val/box_loss | 0.9955 val/cls_loss | 0.5511 【训练过程分析】 这轮训练我经历了从初始到稳定的曲折过程。前 20 个epoch,loss 曲线呈现了陡峭的下降趋势,mAP50 指标从 0.8 开始逐步攀升,仿佛在寻找一个合适的平衡点。然而,从第 21 个epoch 开始,mAP50 的提升速率显著放缓,整体曲线显得有些曲折,有时甚至停滞不前,让我一度以为训练出现了问题。直到第 35 个epoch,loss 开始逐渐趋于平稳,这标志着模型已经找到了一个较好的收敛区间。到了最后的 20 个 epoch,尽管 mAP50 依旧在稳步上升,但提升幅度已经不大,这意味着模型已经接近其性能天花板。 在这个过程中,我重点关注了 box_loss 和 cls_loss 的变化。初期阶段,box_loss 快速下降,从 0.9 逐渐降至 0.86,而 cls_loss 则从 0.75 逐步下降至... 使用场景:毕业设计、课程设计、深度学习入门、工业场景落地验证。
内容概要:本文围绕“双碳”战略背景,系统阐述了基于Simulink的汽车碳排放建模与仿真技术,重点引入模糊PID控制优化动力系统性能,以实现节能减排目标。文档整合了多个Matlab/Simulink科研仿真案例,涵盖无刷直流电机(BLDC)控制、三相PWM整流器、电池管理系统、路径规划、信号处理、智能优化算法及图像处理等领域,全面展示Matlab在智能控制与绿色能源系统中的应用价值。同时强调科研应兼具严谨逻辑、创新思维与工具赋能,并提供完整的仿真资源链接与学习路径支持实践落地。; 适合人群:具备Matlab/Simulink基础,从事自动化、电气工程、车辆工程、控制科学、电力电子及智能制造等相关领域的科研人员或高年级本科生、研究生;适用于开展节能减排、新能源系统优化、智能控制算法研究等课题的研究者。; 使用场景及目标:①学习在Simulink中构建汽车能耗与排放仿真模型并应用模糊PID进行动态优化;②掌握BLDC、PWM整流器等关键部件的建模与控制策略设计;③借鉴丰富案例提升科研效率,拓展在智能控制、路径规划、信号处理等方向的应用能力;④通过提供的网盘资源获取完整代码与资料,支撑论文写作与项目开发。; 阅读建议:建议按照资源目录顺序系统学习,结合百度网盘提供的Matlab/Simulink代码动手实践,重点关注控制策略的设计、仿真结果的分析与优化过程,同时注重培养科研思维与工程实际问题的结合能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值