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

目录

一、关于桥接模式

二、设计要求

三、设计实现

1.抽象

2.实现者

3.细化抽象

4.具体实现者

四、应用程序

五、执行结果


一、关于桥接模式

设计模式:19、桥接模式-CSDN博客

二、设计要求

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

三、设计实现

1.抽象

CCTV.java

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

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

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

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

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

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;
	}
	
}

四、应用程序

java 复制代码
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);
	}

}

五、执行结果

相关推荐
杯子不吃紫菜9 小时前
LangGraph 体系实战(下):中断恢复、流式、子图与设计模式
单片机·嵌入式硬件·设计模式
是2的10次方啊12 小时前
设计模式与生活⑳:楼里的事都找前台,你就再没见过师傅
设计模式
是2的10次方啊1 天前
设计模式与生活⑲:投影连不上,别急着换投影仪
设计模式
cjz38992 天前
规则树:把一百行if-else拆成一棵树
设计模式
Adellle2 天前
设计模式指南 (Java 版) ㊁
java·开发语言·设计模式
是2的10次方啊2 天前
设计模式与生活⑱:工资还没焐热,账单已经凑成一摞
设计模式
百思不得小李3 天前
一个复杂的动态表单是如何实现的
前端·设计模式
爱你真是太好了3 天前
上下文组成以及如何压缩
设计模式
freejackman3 天前
【工程化】从“单兵作战”到“多引擎架构”:基于门面模式的重构实战
大数据·数据库·hive·sql·测试工具·设计模式·架构
Java成神之路-3 天前
从 if-else 到优雅解耦:策略 / 适配器 / 组合模式全流程实战
设计模式