Maison  >  Article  >  Java  >  Application d'interfaces et de classes abstraites dans les modèles de conception en Java

Application d'interfaces et de classes abstraites dans les modèles de conception en Java

PHPz
PHPzoriginal
2024-05-01 18:33:01544parcourir

Les interfaces et les classes abstraites sont utilisées dans les modèles de conception pour le découplage et l'extensibilité. Les interfaces définissent les signatures des méthodes, les classes abstraites fournissent une implémentation partielle et les sous-classes doivent implémenter des méthodes non implémentées. Dans le modèle de stratégie, l'interface est utilisée pour définir l'algorithme, et la classe abstraite ou la classe concrète assure l'implémentation, permettant une commutation dynamique des algorithmes. Dans le modèle d'observateur, les interfaces sont utilisées pour définir le comportement de l'observateur, et les classes abstraites ou concrètes sont utilisées pour s'abonner et publier des notifications. Dans le modèle d'adaptateur, les interfaces sont utilisées pour adapter les classes existantes ou les classes concrètes peuvent implémenter des interfaces compatibles, permettant une interaction avec le code d'origine.

Java 中接口和抽象类在设计模式中的应用

Application des interfaces et des classes abstraites dans les modèles de conception en Java

Dans la conception de logiciels, les interfaces et les classes abstraites sont des éléments clés pour réaliser le découplage et l'évolutivité. Ils permettent de développer et de déployer différents modules indépendamment tout en conservant la compatibilité.

Interface

  • Une interface définit un ensemble de signatures de méthodes mais ne fournit pas d'implémentation pour celles-ci.
  • Une classe qui implémente une interface doit implémenter toutes les méthodes déclarées.
  • Une interface peut avoir plusieurs implémentations, permettant de changer différents comportements au moment de l'exécution.

Classe abstraite

  • La classe abstraite fournit une implémentation partielle et certaines de ses méthodes ne sont pas implémentées.
  • Les sous-classes qui étendent une classe abstraite doivent implémenter toutes les méthodes non implémentées ou se déclarer abstraites.
  • Une classe abstraite ne peut avoir qu'une seule implémentation, mais est accessible via le polymorphisme dans ses sous-classes.

Applications dans les modèles de conception

Les interfaces et les classes abstraites jouent un rôle essentiel dans les modèles de conception, améliorant la flexibilité, la réutilisabilité et la testabilité du code à travers :

Modèle de stratégie : Utilisez une interface pour définir un ensemble de algorithmes, et utiliser une classe abstraite ou une implémentation concrète pour fournir l’implémentation. Cela permet aux algorithmes d'être commutés dynamiquement selon les besoins au moment de l'exécution.

Modèle d'observateur : Utilisez des interfaces pour définir le comportement des observateurs et des abonnés. Des classes abstraites ou des implémentations concrètes peuvent être utilisées comme objets d'abonnement, tandis que les observateurs peuvent s'inscrire et se désinscrire pour recevoir des mises à jour.

Adapter Pattern : Utilisez des interfaces pour adapter les classes existantes à différentes interfaces. Les classes abstraites ou les implémentations concrètes peuvent implémenter des interfaces compatibles, leur permettant d'interagir avec le code existant.

Cas pratique

Modèle de stratégie :

interface SortingAlgorithm {
    int[] sort(int[] arr);
}

abstract class AbstractSortingAlgorithm implements SortingAlgorithm {
    public void swap(int[] arr, int i, int j) {
        // 交换 arr 中索引为 i 和 j 的元素
    }
}

class BubbleSort extends AbstractSortingAlgorithm {
    @Override
    public int[] sort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    swap(arr, j, j + 1);
                }
            }
        }
        return arr;
    }
}

class QuickSort extends AbstractSortingAlgorithm {
    @Override
    public int[] sort(int[] arr) {
        // 快排算法实现
    }
}

// 使用
SortingAlgorithm algorithm = new BubbleSort();
int[] sortedArr = algorithm.sort(arr);

Dans cet exemple, l'interface SortingAlgorithm définit le comportement de tri, tandis que BubbleSort et QuickSort fournit une implémentation spécifique. Puisqu’ils implémentent tous deux la même interface, ils peuvent facilement être échangés au moment de l’exécution selon les besoins. <code>SortingAlgorithm 接口定义了排序行为,而 BubbleSortQuickSort 则提供了具体实现。由于它们都实现了相同的接口,因此可以轻松地根据需要在运行时交换它们。

观察者模式:

interface Observer {
    void update(Observable observable);
}

abstract class Observable {
    private List<Observer> observers = new ArrayList<>();

    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    protected void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(this);
        }
    }
}

class ConcreteObservable extends Observable {
    private int state;

    public void setState(int state) {
        this.state = state;
        notifyObservers();
    }
}

class ObserverA implements Observer {
    @Override
    public void update(Observable observable) {
        // 收到通知并根据变化的 state 做出反应
    }
}

// 使用
ConcreteObservable observable = new ConcreteObservable();
ObserverA observerA  = new ObserverA();
observable.addObserver(observerA);
observable.setState(10); // 通知观察者 state 发生变化

在这个示例中,Observer 接口定义了观察者的行为,而 Observable 抽象类提供了订阅和发布通知的机制。ConcreteObservableObserverA 是具体实现,其中 ConcreteObservable 管理观察者列表并通知其状态更改,而 ObserverA

🎜Modèle Observateur : 🎜🎜rrreee🎜Dans cet exemple, l'interface Observer définit le comportement de l'observateur, tandis que la classe abstraite Observable fournit un mécanisme de notifications d'abonnement et de publication. ConcreteObservable et ObserverA sont des implémentations concrètes, où ConcreteObservable gère une liste d'observateurs et les informe des changements d'état, tandis que ObserverA > peut prendre des mesures en fonction de ces changements. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Le rôle de try en javaArticle suivant:Le rôle de try en java