桥接模式代码实现
- 某软件公司要开发一个跨平台图像浏览系统。
实例说明:要求该系统能够显示BMP、JPG、GIF、PNG等多种格式的文件,并且能够在Windows、Linux、UNIX等多个操作系统上运行。系统首先将各种格式的文件解析为像素矩阵(Matrix),然后将像素矩阵显示在屏幕上,在不同的操作系统中可调用不同的绘制函数来绘制像素矩阵。另外,系统需具有较好的扩展性,以便在将来支持新的文件格式和操作系统。试使用桥接模式设计该跨平台图像浏览系统。
- 类图:

- . 源代码:
package com.fish.pattern.bridge;
public class Matrix {
}
package com.fish.pattern.bridge;
//JPG格式图像:扩充抽象类
public class JPGImage extends Image {
public void parseFile(String fileName) {
//模拟解析JPG文件并获得一个像素矩阵对象m;
Matrix m = new Matrix();
imp.doPaint(m);
System.out.println(fileName + ",格式为JPG。");
}
}
package com.fish.pattern.bridge;
//PNG格式图像:扩充抽象类
public class PNGImage extends Image {
public void parseFile(String fileName) {
//模拟解析PNG文件并获得一个像素矩阵对象m;
Matrix m = new Matrix();
imp.doPaint(m);
System.out.println(fileName + ",格式为PNG。");
}
}
package com.fish.pattern.bridge;
//GIF格式图像:扩充抽象类
public class GIFImage extends Image {
public void parseFile(String fileName) {
//模拟解析GIF文件并获得一个像素矩阵对象m;
Matrix m = new Matrix();
imp.doPaint(m);
System.out.println(fileName + ",格式为GIF。");
}
}
package com.fish.pattern.bridge;
//BMP格式图像:扩充抽象类
public class BMPImage extends Image {
public void parseFile(String fileName) {
//模拟解析BMP文件并获得一个像素矩阵对象m;
Matrix m = new Matrix();
imp.doPaint(m);
System.out.println(fileName + ",格式为BMP。");
}
}
package com.fish.pattern.bridge;
//Windows操作系统实现类:具体实现类
public class WindowsImp implements ImageImp {
public void doPaint(Matrix m) {
//调用Windows系统的绘制函数绘制像素矩阵
System.out.print("在Windows操作系统中显示图像:");
}
}
package com.fish.pattern.bridge;
//Linux操作系统实现类:具体实现类
public class LinuxImp implements ImageImp {
public void doPaint(Matrix m) {
//调用Linux系统的绘制函数绘制像素矩阵
System.out.print("在Linux操作系统中显示图像:");
}
}
package com.fish.pattern.bridge;
//Unix操作系统实现类:具体实现类
public class UnixImp implements ImageImp {
public void doPaint(Matrix m) {
//调用Unix系统的绘制函数绘制像素矩阵
System.out.print("在Unix操作系统中显示图像:");
}
}
package com.fish.pattern.bridge;
//抽象图像类:抽象类
public abstract class Image {
protected ImageImp imp;
public void setImageImp(ImageImp imp) {
this.imp = imp;
}
public abstract void parseFile(String fileName);
}
package com.fish.pattern.bridge;
//抽象操作系统实现类:实现类接口
public interface ImageImp {
public void doPaint(Matrix m); //显示像素矩阵m
}
package com.fish.pattern.bridge;
public class Client {
public static void main(String args[]) {
Image image;
ImageImp imp;
image = new JPGImage();
imp = new WindowsImp();
image.setImageImp(imp);
image.parseFile("小龙女");
}
}
- 运行结果:

代理模式代码实现
- 某软件公司开发收费商务信息查询系统。
实例说明:系统基本需求是:在进行商务信息查询之前用户需要通过身份验证,只有合法用户才能够使用该查询系统; 在进行商务信息查询时系统需要记录查询日志,以便根据查询次数收取查询费用。该公司开发人员已完成了商务信息查询模块的开发任务,现希望能够以一种松耦合的方式向原有系统增加身份验证和日志记录功能,客户端代码可以无区别地对待原始的商务信息查询模块和增加新功能之后的商务信息查询模块,且可能在将来增加一些新功能。现使用代理模式设计并实现该收费商务信息查询系统。
- 类图:

- 源代码:
package com.fish.pattern.proxy;
public interface Searcher {
String DoSearcher(String userId,String keyword);
}
package com.fish.pattern.proxy;
public class ProxySearcher implements Searcher{
private RealSearcher searcher = new RealSearcher(); //维持一个对真实主题的引用
private AccessValidator validator;
private Logger logger;
@Override
public String DoSearcher(String userId, String keyword) {
//如果身份验证成功,则执行查询
if (this.Validate(userId))
{
String result = searcher.DoSearcher(userId, keyword); //调用真实主题对象的查询方法
this.Log(userId); //记录查询日志
return result; //返回查询结果
}
else
{
return null;
}
}
//创建访问验证对象并调用其Validate()方法实现身份验证
public boolean Validate(String userId)
{
validator = new AccessValidator();
return validator.Validate(userId);
}
//创建日志记录对象并调用其Log()方法实现日志记录
public void Log(String userId)
{
logger = new Logger();
logger.Log(userId);
}
}
package com.fish.pattern.proxy;
public class RealSearcher implements Searcher{
@Override
public String DoSearcher(String userId, String keyword) {
System.out.println("用户"+userId+"使用关键词"+keyword+"查询商务信息!");
return "返回具体内容";
}
}
package com.fish.pattern.proxy;
public class Logger {
//模拟实现日志记录
public void Log(String userId) {
System.out.println("更新数据库,用户"+userId+"查询次数加1!");
}
}
package com.fish.pattern.proxy;
public class AccessValidator
{
//模拟实现登录验证
public boolean Validate(String userId)
{
System.out.println("在数据库中验证用户'" + userId + "'是否是合法用户?");
if (userId.equals("杨过")) {
System.out.println();
return true;
}
else {
System.out.println(userId+"登录失败!");
return false;
}
}
}
package com.fish.pattern.proxy;
public class Client {
public static void main(String[] args) {
Searcher proxySearcher = new ProxySearcher();
proxySearcher.DoSearcher("杨过","玉女心经");
}
}
- 运行结果:
