Java设计模式进阶,观察者与策略模式实战

iT日记 编程开发 317

在Java编程领域,设计模式犹如一把锋利的宝剑,能够帮助开发者更高效地构建出可维护、可扩展的软件系统。随着对Java编程理解的不断深入,掌握设计模式的进阶知识变得尤为重要。其中,观察者模式和策略模式是两个极具实用价值的设计模式,它们在不同的场景下发挥着独特的作用,通过实战运用,能让我们深刻体会到设计模式的魅力。

观察者模式,也被称为发布 - 订阅模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的状态。在实际应用中,观察者模式有着广泛的应用场景,比如在图形用户界面(GUI)开发中,当一个按钮被点击时,可能会触发多个不同的操作,这些操作就可以作为观察者来监听按钮这个主题对象的状态变化。以一个简单的股票市场为例,股票价格的变化是主题对象,而股民们则是观察者。当股票价格发生变动时,股民们会收到通知并根据价格变化做出相应的决策。

在Java中实现观察者模式,通常会定义一个主题接口和一个观察者接口。主题接口包含注册、移除观察者以及通知观察者的方法,而观察者接口则包含更新状态的方法。以下是一个简单的Java代码示例:

```java

import java.util.ArrayList;

import java.util.List;

// 主题接口

interface Subject {

void registerObserver(Observer observer);

void removeObserver(Observer observer);

void notifyObservers();

}

// 观察者接口

interface Observer {

void update(double price);

}

// 具体主题类

class Stock implements Subject {

private double price;

private List observers;

public Stock() {

observers = new ArrayList();

}

@Override

public void registerObserver(Observer observer) {

observers.add(observer);

}

@Override

public void removeObserver(Observer observer) {

observers.remove(observer);

}

@Override

public void notifyObservers() {

for (Observer observer : observers) {

observer.update(price);

}

}

public void setPrice(double price) {

this.price = price;

notifyObservers();

}

}

// 具体观察者类

class Investor implements Observer {

private String name;

public Investor(String name) {

this.name = name;

}

@Override

public void update(double price) {

System.out.println(name + " 收到通知,股票价格变为:" + price);

}

}

public class ObserverPatternDemo {

public static void main(String[] args) {

Stock stock = new Stock();

Investor investor1 = new Investor("张三");

Investor investor2 = new Investor("李四");

stock.registerObserver(investor1);

stock.registerObserver(investor2);

stock.setPrice(100.0);

}

}

```

接下来,我们再看看策略模式。策略模式定义了一系列的算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户端。在实际开发中,当一个系统需要根据不同的情况选择不同的算法时,策略模式就派上用场了。比如在电商系统中,根据不同的促销活动,可能会有不同的折扣算法,这些折扣算法就可以封装成不同的策略。

在Java中实现策略模式,通常会定义一个策略接口和多个具体的策略类。以下是一个简单的Java代码示例:

```java

// 策略接口

interface DiscountStrategy {

double applyDiscount(double price);

}

// 具体策略类:无折扣

class NoDiscountStrategy implements DiscountStrategy {

@Override

public double applyDiscount(double price) {

return price;

}

}

// 具体策略类:10%折扣

class TenPercentDiscountStrategy implements DiscountStrategy {

@Override

public double applyDiscount(double price) {

return price * 0.9;

}

}

// 上下文类

class ShoppingCart {

private DiscountStrategy discountStrategy;

public ShoppingCart(DiscountStrategy discountStrategy) {

this.discountStrategy = discountStrategy;

}

public double calculateTotal(double price) {

return discountStrategy.applyDiscount(price);

}

}

public class StrategyPatternDemo {

public static void main(String[] args) {

ShoppingCart cart = new ShoppingCart(new TenPercentDiscountStrategy());

double total = cart.calculateTotal(100.0);

System.out.println("折扣后的总价:" + total);

}

}

```

通过观察者模式和策略模式的实战应用,我们可以看到设计模式在Java编程中的重要性。它们不仅能够提高代码的可维护性和可扩展性,还能让我们的代码更加灵活和高效。在实际开发中,我们应该根据具体的需求合理运用这些设计模式,不断提升自己的编程能力。

标签: java设计模式视频教程 java中设计模式到底是干啥的 java设计模式详解