在软件开发中,设计模式是解决常见问题的经典方案。代理模式和观察者模式是两种非常实用的设计模式,它们可以帮助我们提高代码质量与效率。本文将深入探讨这两种模式,并通过具体的Java代码示例来帮助您更好地理解它们。
代理模式
代理模式是一种结构型设计模式,它为其他对象提供一个代理以控制对这个对象的访问。代理模式的主要目的是在访问对象时进行一些额外的操作,如日志记录、安全检查等。
代理模式的实现
以下是一个简单的Java代理模式示例:
// 被代理接口
interface Image {
void display();
}
// 实现类
class RealImage implements Image {
private String fileName;
public RealImage(String fileName) {
this.fileName = fileName;
loadImageFromDisk();
}
@Override
public void display() {
System.out.println("Displaying " + fileName);
}
private void loadImageFromDisk() {
System.out.println("Loading " + fileName + " from disk.");
}
}
// 代理类
class ProxyImage implements Image {
private RealImage realImage;
private String fileName;
public ProxyImage(String fileName) {
this.fileName = fileName;
}
@Override
public void display() {
if (realImage == null) {
realImage = new RealImage(fileName);
}
realImage.display();
}
}
// 客户端代码
public class ProxyPatternDemo {
public static void main(String[] args) {
Image image = new ProxyImage("test_image.jpg");
// 图像将从磁盘加载
image.display();
System.out.println("");
// 图像不需要从磁盘加载
image.display();
}
}
在上面的示例中,RealImage类是真实图像的类,而ProxyImage类是一个代理,它将图像的加载延迟到实际需要时。当调用display方法时,如果图像尚未加载,代理将加载图像。
观察者模式
观察者模式是一种行为型设计模式,它定义了对象之间的一对多依赖关系,当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。
观察者模式的实现
以下是一个简单的Java观察者模式示例:
// 观察者接口
interface Observer {
void update(String message);
}
// 具体观察者
class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " received message: " + message);
}
}
// 被观察者接口
interface Subject {
void attach(Observer observer);
void detach(Observer observer);
void notifyObservers(String message);
}
// 具体被观察者
class ConcreteSubject implements Subject {
private List<Observer> observers = new ArrayList<>();
private String message;
@Override
public void attach(Observer observer) {
observers.add(observer);
}
@Override
public void detach(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyObservers(String message) {
this.message = message;
for (Observer observer : observers) {
observer.update(message);
}
}
}
// 客户端代码
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new ConcreteSubject();
Observer observer1 = new ConcreteObserver("Observer 1");
Observer observer2 = new ConcreteObserver("Observer 2");
subject.attach(observer1);
subject.attach(observer2);
subject.notifyObservers("Hello, Observers!");
subject.detach(observer1);
subject.notifyObservers("Hello again, Observer 2!");
}
}
在上面的示例中,ConcreteSubject类是具体被观察者,它维护一个观察者列表,并在状态改变时通知所有观察者。ConcreteObserver类是具体观察者,它实现update方法来处理接收到的消息。
通过理解和使用代理模式和观察者模式,您可以提高代码的可读性、可维护性和可扩展性。这两种模式在Java编程中非常实用,可以帮助您解决许多常见问题。
