实验四 结构型设计模式总结
一、实验目的
1、掌握桥接模式结构与实现;
2、掌握外观的结构与实现;
二、实验原理
1、桥接模式的原理
桥接模式将抽象部分与它的实现部分解耦,使得两者都能够独立变化。用抽象关联取代了传统的多层继承,将类之间的静态继承关系转换为动态的对象组合关系。
2、外观模式的原理
引入一个新的外观类(Facade)来负责和多个业务类或称子系(Subsystem)进行交互,而客户类只需与外观类交互,为多个业务类的调用提供了一个统一的入口,简化了类与类之间的交互。引入外观模式前后对比如下图:
三、实验内容
题目一:某软件公司要开发一个跨平台图像浏览系统,要求该系统能够显示BMP、JPG、GIF、PNG等多种格式的文件,并且能够在Windows、Linux、UNIX等多个操作系统上运行。系统首先将各种格式的文件解析为像素矩阵(Matrix),然后将像素矩阵显示在屏幕上,在不同的操作系统中可以调用不同的绘制函数来绘制像素矩阵。另外,系统需具有较好的扩展性,以便在将来支持新的文件格式和操作系统。试使用桥接模式设计该跨平台图像浏览系统。
[实验步骤]
(1)分析案例,采用桥接模式设计类图,确定桥接模式的角色。
(2)分析得到类图如下:
在上图中Image:抽象图像类其子类JPGImage,PNGImage、BMPImage、GIFImage为扩充抽象类;ImageImp为实现类接口,其子类WindowsImp、LinuxImp和UnixImp为具体实现类。
(3) 完成全部代码,编译并运行结果。
第一题实验结果
画出的UML如下图所示:
Image.java
public abstract class Image {
protected ImageImp imp;
public ImageImp m_ImageImp;
public Image(){
}
public void finalize() throws Throwable {
}
public abstract void ParseFile(String fileName);
public void SetImageImp(ImageImp imp){
this.imp = imp;
}
}
ImageImp.java(接口)
public interface ImageImp {
public void DoPaint(Matrix m);
}
Matrix.java
public class Matrix {
public Matrix(){
}
public void finalize() throws Throwable {
}
}
JPGImage.java
public class JPGImage extends Image {
public JPGImage(){
}
public void finalize() throws Throwable {
super.finalize();
}
public void ParseFile(String fileName){
Matrix m = new Matrix();
imp.DoPaint(m);
System.out.println(fileName + ", 格式为JPG");
}
}
PNGImage.java
public class PNGImage extends Image {
public PNGImage(){
}
public void finalize() throws Throwable {
super.finalize();
}
public void ParseFile(String fileName){
Matrix m = new Matrix();
imp.DoPaint(m);
System.out.println(fileName + ", 格式为PNG");
}
}
BMPImage.java
public class BMPImage extends Image {
public BMPImage(){
}
public void finalize() throws Throwable {
super.finalize();
}
public void ParseFile(String fileName){
Matrix m = new Matrix();
imp.DoPaint(m);
System.out.println(fileName + ", 格式为BMP");
}
}
GIFImage.java
public class GIFImage extends Image {
public GIFImage(){
}
public void finalize() throws Throwable {
super.finalize();
}
public void ParseFile(String fileName){
Matrix m = new Matrix();
imp.DoPaint(m);
System.out.println(fileName + ", 格式为GIF");
}
}
LinuxImp.java
public class LinuxImp implements ImageImp {
public LinuxImp(){
}
public void finalize() throws Throwable {
}
public void DoPaint(Matrix m){
System.out.print("在Linux操作系统中显示图像: ");
}
}
UnixImp.java
public class UnixImp implements ImageImp {
public UnixImp(){
}
public void finalize() throws Throwable {
}
public void DoPaint(Matrix m){
System.out.print("在Unix操作系统中显示图像: ");
}
}
WindowsImp.java
public class WindowsImp implements ImageImp {
public WindowsImp(){
}
public void finalize() throws Throwable {
}
public void DoPaint(Matrix m){
System.out.print("在Windows操作系统中显示图像: ");
}
}
测试类Client.java
public class Client {
public static void main(String[] args) {
Image image;
ImageImp imp;
image = new JPGImage();
imp = new UnixImp();
image.SetImageImp(imp);
image.ParseFile("孙悟空");
BMP();
PNG();
GIF();
}
public static void PNG() {
Image image;
ImageImp imp;
image = new PNGImage();
imp = new UnixImp();
image.SetImageImp(imp);
image.ParseFile("沙悟净");
}
public static void GIF() {
Image image;
ImageImp imp;
image = new GIFImage();
imp = new WindowsImp();
image.SetImageImp(imp);
image.ParseFile("猪八戒");
}
public static void BMP() {
Image image;
ImageImp imp;
image = new BMPImage();
imp = new LinuxImp();
image.SetImageImp(imp);
image.ParseFile("白骨精");
}
}
输出结果
在Unix操作系统中显示图像: 孙悟空, 格式为JPG
在Linux操作系统中显示图像: 白骨精, 格式为BMP
在Unix操作系统中显示图像: 沙悟净, 格式为PNG
在Windows操作系统中显示图像: 猪八戒, 格式为GIF
题目二:在电脑主机(Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法,如内存(Memory)的自检(check()),CPU的运行(run()),硬盘(HardDisk)的读取(read()),操作系统(OS)的载入(load())等,如果某一过程发生错误则电脑启动失败。使用外观模式模拟该过程,绘制类图模拟该过程。
[实验步骤]
(1) 分析案例,采用外观模式设计类图,确定外观模式的角色。
(2) 分析得到相应类图。
第二题实验结果
画出的UML如下图所示:
MainFrame.java
import java.util.Random;
public class MainFrame {
private CPU cpu;
private HardDisk harddisk;
private Memory memory;
private OS os;
public MainFrame(){
}
public void finalize() throws Throwable {
}
public boolean on(){
CPU cpu = new CPU();
boolean bool_cpu = new Random().nextBoolean();
cpu.run(bool_cpu);
HardDisk hardDisk = new HardDisk();
boolean bool_hardDisk = new Random().nextBoolean();
hardDisk.read(bool_hardDisk);
Memory memory = new Memory();
boolean bool_memory = new Random().nextBoolean();
memory.check(bool_memory);
OS os = new OS();
boolean bool_os = new Random().nextBoolean();
os.load(bool_os);
if (bool_cpu && bool_hardDisk && bool_memory && bool_os){
System.out.println("----开机成功!----");
return true;
} else {
System.out.println("----开机失败!----");
return false;
}
}
}
CPU.java
public class CPU {
public CPU(){
}
public void finalize() throws Throwable {
}
public boolean run(boolean bool){
if (bool) {
System.out.println("CPU运行成功!");
return true;
} else {
System.out.println("CPU运行失败!");
return false;
}
}
}
HardDisk.java
public class HardDisk {
public HardDisk(){
}
public void finalize() throws Throwable {
}
public boolean read(boolean bool){
if (bool) {
System.out.println("硬盘读取成功!");
return true;
} else {
System.out.println("硬盘读取失败!");
return false;
}
}
}
Memory.java
public class Memory {
public Memory(){
}
public void finalize() throws Throwable {
}
public boolean check(boolean bool){
if (bool) {
System.out.println("内存自检成功!");
return true;
} else {
System.out.println("内存自检失败!");
return false;
}
}
}
OS.java
public class OS {
public OS(){
}
public void finalize() throws Throwable {
}
/**
*
* @param bool
*/
public boolean load(boolean bool){
if (bool) {
System.out.println("系统加载成功!");
return true;
} else {
System.out.println("系统加载失败!");
return false;
}
}
}
测试类Client.java
public class Client {
public static void main(String[] args) {
MainFrame mainFrame = new MainFrame();
mainFrame.on();
}
}
输出结果
CPU运行成功!
硬盘读取成功!
内存自检失败!
系统加载成功!
----开机失败!----
评论区