Système bancaire
Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy — leçon 85 sur 87.
Ce défi vous demande de construire un Système Bancaire qui modélise des opérations financières du monde réel en utilisant les principes de la POO.
Votre système doit gérer différents types de comptes tels que SavingsAccount et CheckingAccount, tous deux étendant une classe de base Account. Chaque type de compte a des comportements uniques : les comptes d'épargne peuvent générer des intérêts, tandis que les comptes chèques peuvent bénéficier d'une protection contre les découverts.
Réfléchissez à la manière de modéliser les transactions. Une interface comme Transactable pourrait définir des méthodes pour deposit() et withdraw(). Envisagez d'utiliser des exceptions personnalisées telles que InsufficientFundsException pour gérer les opérations invalides avec élégance.
Une classe Bank pourrait gérer plusieurs comptes et clients, illustrant la composition. Vous pourriez appliquer le pattern Factory pour créer différents types de comptes, ou utiliser le pattern Observer pour informer les clients des modifications de compte.
Mettez l'accent sur l'encapsulation pour protéger les données sensibles telles que les soldes et les numéros de compte, et utilisez le polymorphisme pour traiter uniformément les différents types de comptes.
Défi
FacileConstruisons un système bancaire complet qui démontre votre maîtrise des principes de la POO ! Vous allez créer un système avec différents types de comptes, une gestion des transactions et une gestion appropriée des exceptions, le tout organisé sur plusieurs fichiers.
Vous organiserez votre code sur sept fichiers :
Transactable.java: Créez une interface qui définit le contrat pour les opérations financières. Elle doit déclarer les méthodesdeposit(double amount)etwithdraw(double amount), toutes deux retournant un booléen pour indiquer la réussite.InsufficientFundsException.java: Créez une exception personnalisée qui étendException. Le constructeur doit accepter le montant de retrait tenté et le solde actuel, en créant un message au format"Insufficient funds: attempted %.2f, available %.2f".Account.java: Créez une classe de base abstraite représentant n'importe quel compte bancaire. Incluez des champs privés pouraccountNumber(String) etbalance(double), un constructeur qui initialise les deux, des getters appropriés, un setter protégé pour le solde (afin que les sous-classes puissent le modifier), et une méthode abstraitegetAccountType()qui retourne un String. Implémentez une méthodegetDetails()qui retourne"%s (%s): $%.2f"avec le solde formaté à 2 décimales.SavingsAccount.java: Créez une classe qui étendAccountet implémenteTransactable. Ajoutez un champ privé pourinterestRate(double). Le constructeur prend accountNumber, le solde initial et interestRate. ImplémentezgetAccountType()pour retourner"Savings". Pourdeposit(), ajoutez le montant au solde et retournez true. Pourwithdraw(), si le montant dépasse le solde, retournez false ; sinon, soustrayez et retournez true. Ajoutez une méthodeapplyInterest()qui augmente le solde debalance * interestRate(le taux est stocké sous forme de fraction, donc0.05signifie 5 %).CheckingAccount.java: Créez une classe qui étendAccountet implémenteTransactable. Ajoutez un champ privé pouroverdraftLimit(double). Le constructeur prend accountNumber, le solde initial et overdraftLimit. ImplémentezgetAccountType()pour retourner"Checking". Pourdeposit(), ajoutez le montant et retournez true. Pourwithdraw(), autorisez le retrait si le montant est inférieur ou égal au solde plus overdraftLimit ; retournez false s'il dépasse cette limite.Bank.java: Créez une classe qui gère les comptes à l'aide d'une ArrayList. Incluez les méthodes :addAccount(Account account)- ajoute un compte à la banquefindAccount(String accountNumber)- retourne le compte ou null s'il n'est pas trouvétransfer(String fromAccount, String toAccount, double amount)- transfère de l'argent entre les comptes, en lançant uneInsufficientFundsExceptionsi le compte source a des fonds insuffisants. En cas de succès, retournez"Transferred $%.2f from %s to %s"getTotalDeposits()- retourne la somme de tous les soldes des comptes
Main.java: Construisez votre système bancaire ! Vous recevrez une chaîne de commandes séparées par des virgules :"SAVINGS":accountNumber:balance:interestRate"CHECKING":accountNumber:balance:overdraftLimit"DEPOSIT":accountNumber:amount"WITHDRAW":accountNumber:amount"TRANSFER":fromAccount:toAccount:amount"INTEREST":accountNumber
Traitez chaque commande et affichez :
- SAVINGS/CHECKING :
"Account created: "+ accountNumber - DEPOSIT :
"Deposited $%.2f to %s%n" - WITHDRAW :
"Withdrew $%.2f from %s%n"en cas de succès, ou"Withdrawal failed: "+ accountNumber - TRANSFER : Affichez le message de succès ou
"Transfer failed: "+ message de l'exception - INTEREST :
"Interest applied to "+ accountNumber
Après toutes les commandes, affichez
"--- Bank Summary ---"suivi des détails de chaque compte (en utilisantgetDetails()) et enfin"Total deposits: $%.2f%n"formaté à 2 décimales.
Vous recevrez une seule entrée : la chaîne de commandes séparées par des virgules.
Par exemple, avec l'entrée SAVINGS:SAV001:1000.00:0.05,CHECKING:CHK001:500.00:200.00,DEPOSIT:SAV001:250.00,WITHDRAW:CHK001:600.00,TRANSFER:SAV001:CHK001:100.00,INTEREST:SAV001, votre sortie serait :
Account created: SAV001
Account created: CHK001
Deposited $250.00 to SAV001
Withdrew $600.00 from CHK001
Transferred $100.00 from SAV001 to CHK001
Interest applied to SAV001
--- Bank Summary ---
SAV001 (Savings): $1207.50
CHK001 (Checking): $0.00
Total deposits: $1207.50Remarquez comment le compte courant permet le retrait de 600 $ malgré un solde de seulement 500 $ — c'est la protection contre les découverts en action ! Le compte d'épargne gagne 5 % d'intérêts sur son solde après le transfert. Ce défi combine l'héritage, les interfaces, le polymorphisme, les exceptions personnalisées et l'encapsulation dans une application bancaire réaliste !
Essayez vous-même
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
// TODO: Créer une instance de Bank
// TODO: Diviser l'entrée par virgule pour obtenir les commandes individuelles
// TODO: Traiter chaque commande :
// - SAVINGS:accountNumber:balance:interestRate -> Créer un SavingsAccount, afficher "Account created: [accountNumber]"
// - CHECKING:accountNumber:balance:overdraftLimit -> Créer un CheckingAccount, afficher "Account created: [accountNumber]"
// - DEPOSIT:accountNumber:amount -> Déposer et afficher "Deposited $[amount] to [accountNumber]"
// - WITHDRAW:accountNumber:amount -> Retirer et afficher le succès ou "Withdrawal failed: [accountNumber]"
// - TRANSFER:fromAccount:toAccount:amount -> Transférer et afficher le succès ou "Transfer failed: [exception message]"
// - INTEREST:accountNumber -> Appliquer les intérêts et afficher "Interest applied to [accountNumber]"
// TODO: Après toutes les commandes, afficher "--- Bank Summary ---"
// TODO: Afficher les détails de chaque compte en utilisant getDetails()
// TODO: Afficher "Total deposits: $[total]" formaté à 2 décimales
}
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesChamps (Attributs)Méthode constructeurSurcharge de constructeurRécapitulatif - Calculatrice simple4Héritage
Héritage de base (extends)Le mot-clé superRedéfinition de méthode (@Override)Chaînage de constructeursLa classe ObjectHéritage simple et multiniveauPourquoi pas d'héritage multiple de classesRécapitulatif - Hiérarchie des employés7Méthodes spéciales et classe Object
Méthode toString()equals() et hashCode()Méthode clone()compareTo() et ComparableInterface ComparatorRécapitulatif - Tri personnalisé2Modificateurs d'accès et Encapsulation
Aperçu des niveaux d'accèsMéthodes Getter et SetterMasquage d'informationsLe mot-clé finalRécapitulatif - Gestionnaire de compte bancaire5Polymorphisme
Bases de la surcharge de méthodesRedéfinition de méthodes (Run-Time)Upcasting et DowncastingL'opérateur instanceofClasses et méthodes abstraitesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageAgrégation vs CompositionClasses internes, imbriquées et anonymesEnums et méthodes d'EnumRecords (Java 16+)Classes scellées (Java 17+)11Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron MonteurPatron ObservateurPatron Stratégie14Défis finaux
Plateforme d'E-LearningSystème bancaireDéveloppement de personnages de jeuService de location de véhicules3Propriétés de classe et membres statiques
Variables d'instance vs variables statiquesMéthodes statiquesBlocs statiquesConstantes (static final)Récapitulatif - Compteur et utilitaire6Interfaces et Classes Abstraites
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesDefault et Static dans les InterfacesClasses Abstraites vs InterfacesInterfaces FonctionnellesRécapitulatif - Système de Paiement9La généricité
Introduction à la généricitéClasses génériquesMéthodes génériquesParamètres de type bornésWildcards (?, extends, super)Récapitulatif - Conteneur générique12Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositePatron Itérateur