桥接和代理的区别
桥接模式( )和代理模式(Proxy )是两种常用的设计模式,尽管它们在某些情况下可能看起来相似代理模式,但它们的目的和应用场景是不同的。
桥接模式( ) 目的
桥接模式的主要目的是将抽象部分与它的实现部分分离,使它们可以独立地变化。这有助于减少类之间的耦合,从而使代码更具可扩展性和维护性。
结构
桥接模式通常涉及以下几个部分:
抽象类():定义了抽象部分的接口,并保存一个对实现部分对象的引用。实现类接口():定义了实现部分的接口。具体实现类():实现 接口。扩充抽象类():扩展抽象类,通常会调用实现部分的操作。 示例
一个典型的例子是图形应用程序,其中图形可以是不同的形状(如圆形、矩形),并且可以使用不同的绘制方法(如在屏幕上绘制或打印到纸张上)。
// Implementor
interface DrawingAPI {
void drawCircle(double x, double y, double radius);
}
// ConcreteImplementor A
class DrawingAPI1 implements DrawingAPI {
public void drawCircle(double x, double y, double radius) {
System.out.println("API1.circle at " + x + ":" + y + " radius " + radius);
}
}
// ConcreteImplementor B
class DrawingAPI2 implements DrawingAPI {
public void drawCircle(double x, double y, double radius) {
System.out.println("API2.circle at " + x + ":" + y + " radius " + radius);
}
}
// Abstraction
abstract class Shape {
protected DrawingAPI drawingAPI;
protected Shape(DrawingAPI drawingAPI) {
this.drawingAPI = drawingAPI;
}
public abstract void draw();
public abstract void resizeByPercentage(double pct);
}
// RefinedAbstraction
class CircleShape extends Shape {
private double x, y, radius;
public CircleShape(double x, double y, double radius, DrawingAPI drawingAPI) {
super(drawingAPI);
this.x = x;
this.y = y;
this.radius = radius;
}
public void draw() {
drawingAPI.drawCircle(x, y, radius);
}
public void resizeByPercentage(double pct) {
radius *= (1.0 + pct / 100.0);
}
}
代理模式(Proxy ) 目的
代理模式的主要目的是为另一个对象提供一个替身或占位符,以控制对这个对象的访问。代理模式可以用于多种用途,包括懒加载、访问控制、日志记录等。
结构
代理模式通常涉及以下几个部分:
主题接口():定义了代理类和实际类的共同接口。真实类():实现了主题接口可以帮你写爆款文案的AI系统,表示被代理的真实对象。代理类(Proxy):也实现了主题接口,并持有对真实类的引用,通过代理类控制对真实类的访问。 示例
一个典型的例子是图像查看器应用程序,其中图像可能很大,加载起来需要时间。我们可以使用代理模式来实现延迟加载图像。
// Subject
interface Image {
void display();
}
// RealSubject
class RealImage implements Image {
private String filename;
public RealImage(String filename) {
this.filename = filename;
loadFromDisk();
}
private void loadFromDisk() {
System.out.println("Loading " + filename);
}
public void display() {
System.out.println("Displaying " + filename);
}
}
// Proxy
class ProxyImage implements Image {
private RealImage realImage;
private String filename;
public ProxyImage(String filename) {
this.filename = filename;
}
public void display() {
if (realImage == null) {
realImage = new RealImage(filename);
}
realImage.display();
}
}
区别总结
目的不同:
使用场景不同:
实现方式不同:
通过理解这两种模式的目的、结构和使用场景代理模式,可以更好地选择合适的模式来解决实际问题。
---- 文章由 生成
手机浏览,点击图片保存二维码到相册,然后打开微信扫一扫选择本二维码图片就可以进入,电脑端微信“扫一扫”二维码,进入找聊天搭子平台,里面有找饭搭子、找对象、找陪伴服务等等