目 录CONTENT

文章目录

Java-软件设计模式实验-桥接模式与外观模式

~梓
2024-12-07 / 0 评论 / 0 点赞 / 38 阅读 / 0 字
温馨提示:
本文最后更新于2024-12-07,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

实验四 结构型设计模式总结

一、实验目的

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运行成功!
硬盘读取成功!
内存自检失败!
系统加载成功!
----开机失败!----
0

评论区