桥接模式与代理模式区别如下:
桥接模式(Bridge Pattern)是指将抽象和实现解耦,让它们可以独立变化。一个类存在两个(或多个)独立变化的维度,通过组合的方式,让这两个(或多个)维度可以独立进行扩展。
代理模式(Proxy Pattern)是指用一个代理对象来代替对真实对象的引用。主要用来控制对一个对象的访问,同时又能保证安全。
桥接模式示例:
public interface Shape {
void draw();
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("Drawing Circle...");
}
}
public class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("Drawing Rectangle...");
}
}
public class ShapeBridge implements Shape {
private int type; // 类型,1表示圆形,2表示矩形
public ShapeBridge(int type) {
this.type = type;
}
@Override
public void draw() {
if(type == 1) {
Circle circle = new Circle();
circle.draw();
} else if(type == 2) {
Rectangle rectangle = new Rectangle();
rectangle.draw();
} else {
System.out.println("Invalid type!");
}
}
}
在上述代码中,Shape是一个接口,Circle和Rectangle是实现了Shape接口的具体类,它们分别代表圆形和矩形。ShapeBridge是一个桥接类,它也实现了Shape接口,并通过type属性来区分是圆形还是矩形,在draw()方法中根据type属性的值创建对应的圆形或矩形对象,并调用它们的draw()方法进行绘制。这样,通过桥接模式,我们可以很方便地扩展出更多的形状对象。
代理模式示例:
public interface IUserService {
void login();
}
public class UserService implements IUserService {
@Override
public void login() {
System.out.println("Logging in...");
}
}
public class UserServiceProxy implements IUserService {
private IUserService userService;
public UserServiceProxy(IUserService userService) {
this.userService = userService;
}
@Override
public void login() {
System.out.println("Checking credentials..."); // 进行一些前置处理,例如验证用户信息等。
userService.login(); // 调用真实的服务对象的方法进行登录。
}
}
在上述代码中,IUserService是一个接口,UserService是实现了IUserService接口的具体类,它代表一个真实的用户服务对象。UserServiceProxy是一个代理类,它也实现了IUserService接口,并在login()方法中进行一些前置处理(例如验证用户信息等),然后调用真实的服务对象的login()方法进行登录。通过代理模式,我们可以在调用真实的服务对象之前加入一些额外的逻辑处理,从而增强系统的灵活性和可维护性。