目录
一、关于桥接模式
二、设计要求
中央电视台有许多频道,比如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);
}
}
五、执行结果
