JavaRush /Blog Java /Random-VI /Nghỉ giải lao #201. Cách tạo ứng dụng ngân hàng console b...

Nghỉ giải lao #201. Cách tạo ứng dụng ngân hàng console bằng Java

Xuất bản trong nhóm
Nguồn: Medium Hôm nay chúng ta sẽ phát triển một ứng dụng Java đơn giản cho hệ thống ngân hàng. Nó sẽ giúp chúng ta hiểu rõ hơn về cách sử dụng các khái niệm OOP trong các chương trình Java. Nghỉ giải lao #201.  Cách tạo ứng dụng console Banking trong Java - 1Để bắt đầu, chúng ta sẽ cần cài đặt môi trường Java trên máy tính, tốt nhất là Java 11. Tiếp theo, chúng ta sẽ bắt đầu với phần mô tả chi tiết về các chức năng của ứng dụng bảng điều khiển. Chức năng:
  1. Tạo một tài khoản;
  2. Nhập lối ra;
  3. Hiển thị 5 giao dịch gần nhất;
  4. Tiên đặt cọc;
  5. Hiển thị thông tin người dùng hiện tại.
Các khái niệm lập trình hướng đối tượng được sử dụng:
  1. Di sản;
  2. Đa hình;
  3. Đóng gói.

Phát triển ứng dụng

Hãy tạo một dự án Java mới trong Eclipse hoặc IntelliJ IDEA. Hãy xác định một giao diện mới có tên SavingsAccount .
public interface SavingsAccount {

    void deposit(double amount, Date date);
}
Tôi đã triển khai giao diện lưu trữ phương thức gửi tiền . Tôi gọi phương pháp này mỗi lần tôi nạp tiền vào tài khoản séc của mình. Khái niệm OOP được sử dụng ở đây là tính đa hình (các phương thức trong giao diện không có phần thân). Việc triển khai phương thức này có thể được tìm thấy trong lớp Khách hàng bằng cách ghi đè một phương thức có cùng tên và tham số. Bằng cách này, bạn ghi đè một phương thức từ giao diện cha trong lớp con. Sau đó, chúng tôi cần một khách hàng để thêm tiền vào tài khoản séc. Nhưng trước tiên, hãy định nghĩa lớp Customer của chúng ta .
public class Customer extends Person implements SavingsAccount {

    private String username;

    private String password;

    private double balance;

    private ArrayList<String> transactions = new ArrayList<>(5);

    public Customer(String firstName, String lastName, String address, String phone, String username, String password, double balance, ArrayList<String> transactions, Date date) {
        super(firstName, lastName, address, phone);
        this.username = username;
        this.password = password;
        this.balance = balance;
        addTransaction(String.format("Initial deposit - " + NumberFormat.getCurrencyInstance().format(balance) + " as on " + "%1$tD" + " at " + "%1$tT.", date));
    }

    private void addTransaction(String message) {

        transactions.add(0, message);
        if (transactions.size() > 5) {
            transactions.remove(5);
            transactions.trimToSize();
        }
    }

//Getter Setter

    public ArrayList<String> getTransactions() {
        return transactions;
    }

    @Override
    public void deposit(double amount, Date date) {

        balance += amount;
        addTransaction(String.format(NumberFormat.getCurrencyInstance().format(amount) + " credited to your account. Balance - " + NumberFormat.getCurrencyInstance().format(balance) + " as on " + "%1$tD" + " at " + "%1$tT.", date));
    }

    @Override
    public String toString() {
        return "Customer{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", balance=" + balance +
                ", transactions=" + transactions +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Customer customer = (Customer) o;

        if (Double.compare(customer.getBalance(), getBalance()) != 0) return false;
        if (getUsername() != null ? !getUsername().equals(customer.getUsername()) : customer.getUsername() != null)
            return false;
        if (getPassword() != null ? !getPassword().equals(customer.getPassword()) : customer.getPassword() != null)
            return false;
        return getTransactions() != null ? getTransactions().equals(customer.getTransactions()) : customer.getTransactions() == null;
    }

    @Override
    public int hashCode() {
        int result;
        long temp;
        result = getUsername() != null ? getUsername().hashCode() : 0;
        result = 31 * result + (getPassword() != null ? getPassword().hashCode() : 0);
        temp = Double.doubleToLongBits(getBalance());
        result = 31 * result + (int) (temp ^ (temp >>> 32));
        result = 31 * result + (getTransactions() != null ? getTransactions().hashCode() : 0);
        return result;
    }
Khái niệm OOP được sử dụng ở đây là tính kế thừa , vì lớp Khách hàng nhận các thuộc tính từ lớp Người . Nghĩa là, hầu hết tất cả các thuộc tính của lớp Person đều được kế thừa và mối quan hệ cha-con được hiển thị từ Person tới Customer . Bây giờ chúng ta cần một hàm tạo với tất cả các thuộc tính của hai lớp và thêm từ khóa siêu cấu trúc để chỉ định các thuộc tính được kế thừa. Khi triển khai giao diện SavingsAccount , chúng ta phải ghi đè phương thức gửi tiền trong lớp Khách hàng . Để làm điều này, chúng ta sẽ viết một phần triển khai phương thức trong lớp này. Ngoài ra, danh sách giao dịch được khởi tạo để hiển thị năm giao dịch gần nhất. Hàm tạo gọi phương thức addTransaction , hiển thị ngày thay đổi và giao dịch đã hoàn thành.
private void addTransaction(String message) {

        transactions.add(0, message);
        if (transactions.size() > 5) {
            transactions.remove(5);
            transactions.trimToSize();
        }
    }
Bây giờ hãy nói về lớp cha Person .
public class Person {

    private String firstName;

    private String lastName;

    private String address;

    private String phone;

    public Person() {}

    public Person(String firstName, String lastName, String address, String phone) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.address = address;
        this.phone = phone;
    }

//Getters Setters

 @Override
    public String toString() {
        return "Person{" +
                "firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", address='" + address + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }

@Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Person person = (Person) o;

        if (getFirstName() != null ? !getFirstName().equals(person.getFirstName()) : person.getFirstName() != null)
            return false;
        if (getLastName() != null ? !getLastName().equals(person.getLastName()) : person.getLastName() != null)
            return false;
        if (getAddress() != null ? !getAddress().equals(person.getAddress()) : person.getAddress() != null)
            return false;
        return getPhone() != null ? getPhone().equals(person.getPhone()) : person.getPhone() == null;
    }

    @Override
    public int hashCode() {
        int result = getFirstName() != null ? getFirstName().hashCode() : 0;
        result = 31 * result + (getLastName() != null ? getLastName().hashCode() : 0);
        result = 31 * result + (getAddress() != null ? getAddress().hashCode() : 0);
        result = 31 * result + (getPhone() != null ? getPhone().hashCode() : 0);
        return result;
    }
Trong lớp Person , chúng tôi đã sử dụng khái niệm đóng gói bằng cách áp dụng công cụ sửa đổi quyền truy cập riêng tư cho từng thuộc tính. Đóng gói trong Java có thể được định nghĩa là cơ chế theo đó các phương thức hoạt động trên dữ liệu này được kết hợp thành một đơn vị. Về cơ bản, dữ liệu từ lớp Person chỉ có trong lớp này chứ không có trong các lớp hoặc gói khác. Và cuối cùng là lớp chính của chúng ta, được gọi là Bank . Đây là lớp chính nơi chúng tôi chạy ứng dụng và tương tác với chức năng của tất cả các lớp.
public class Bank {

    private static double amount = 0;
    Map<String, Customer> customerMap;

    Bank() {
        customerMap = new HashMap<String, Customer>();
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        Customer customer;
        Bank bank = new Bank();
        int choice;
        outer:
        while (true) {

            System.out.println("\n-------------------");
            System.out.println("BANK    OF     JAVA");
            System.out.println("-------------------\n");
            System.out.println("1. Registrar cont.");
            System.out.println("2. Login.");
            System.out.println("3. Exit.");
            System.out.print("\nEnter your choice : ");
            choice = sc.nextInt();
            sc.nextLine();
            switch (choice) {
                case 1:
                    System.out.print("Enter First Name : ");
                    String firstName = sc.nextLine();
                    System.out.print("Enter Last Name : ");
                    String lastName = sc.nextLine();
                    System.out.print("Enter Address : ");
                    String address = sc.nextLine();
                    System.out.print("Enter contact number : ");
                    String phone = sc.nextLine();
                    System.out.println("Set Username : ");
                    String username = sc.next();
                    while (bank.customerMap.containsKey(username)) {
                        System.out.println("Username already exists. Set again : ");
                        username = sc.next();
                    }
                    System.out.println("Set a password:");
                    String password = sc.next();
                    sc.nextLine();

                    customer = new Customer(firstName, lastName, address, phone, username, password, new Date());
                    bank.customerMap.put(username, customer);
                    break;

                case 2:
                    System.out.println("Enter username : ");
                    username = sc.next();
                    sc.nextLine();
                    System.out.println("Enter password : ");
                    password = sc.next();
                    sc.nextLine();
                    if (bank.customerMap.containsKey(username)) {
                        customer = bank.customerMap.get(username);
                        if (customer.getPassword().equals(password)) {
                            while (true) {
                                System.out.println("\n-------------------");
                                System.out.println("W  E  L  C  O  M  E");
                                System.out.println("-------------------\n");
                                System.out.println("1. Deposit.");
                                System.out.println("2. Transfer.");
                                System.out.println("3. Last 5 transactions.");
                                System.out.println("4. User information.");
                                System.out.println("5. Log out.");
                                System.out.print("\nEnter your choice : ");
                                choice = sc.nextInt();
                                sc.nextLine();
                                switch (choice) {
                                    case 1:
                                        System.out.print("Enter amount : ");
                                        while (!sc.hasNextDouble()) {
                                            System.out.println("Invalid amount. Enter again :");
                                            sc.nextLine();
                                        }
                                        amount = sc.nextDouble();
                                        sc.nextLine();
                                        customer.deposit(amount, new Date());
                                        break;

                                    case 2:
                                        System.out.print("Enter beneficiary username : ");
                                        username = sc.next();
                                        sc.nextLine();
                                        System.out.println("Enter amount : ");
                                        while (!sc.hasNextDouble()) {
                                            System.out.println("Invalid amount. Enter again :");
                                            sc.nextLine();
                                        }
                                        amount = sc.nextDouble();
                                        sc.nextLine();
                                        if (amount > 300) {
                                            System.out.println("Transfer limit exceeded. Contact bank manager.");
                                            break;
                                        }
                                        if (bank.customerMap.containsKey(username)) {
                                            Customer payee = bank.customerMap.get(username); //Todo: check
                                            payee.deposit(amount, new Date());
                                            customer.withdraw(amount, new Date());
                                        } else {
                                            System.out.println("Username doesn't exist.");
                                        }
                                        break;

                                    case 3:
                                        for (String transactions : customer.getTransactions()) {
                                            System.out.println(transactions);
                                        }
                                        break;

                                    case 4:
                                        System.out.println("Titularul de cont cu numele: " + customer.getFirstName());
                                        System.out.println("Titularul de cont cu prenumele : " + customer.getLastName());
                                        System.out.println("Titularul de cont cu numele de utilizator : " + customer.getUsername());
                                        System.out.println("Titularul de cont cu addresa : " + customer.getAddress());
                                        System.out.println("Titularul de cont cu numarul de telefon : " + customer.getPhone());
                                        break;
                                    case 5:
                                        continue outer;
                                    default:
                                        System.out.println("Wrong choice !");
                                }
                            }
                        } else {
                            System.out.println("Wrong username/password.");
                        }
                    } else {
                        System.out.println("Wrong username/password.");
                    }
                    break;

                case 3:
                    System.out.println("\nThank you for choosing Bank Of Java.");
                    System.exit(1);
                    break;
                default:
                    System.out.println("Wrong choice !");
            }}}}
Sử dụng thư viện java.util , chúng ta gọi Scanner để đọc bàn phím. Bằng cách truyền đối tượng Customer thông qua định nghĩa của nó, được gọi là Bank , chúng ta tạo một đối tượng mới có kiểu Bank() . Sau một thời gian, chúng tôi hiển thị menu bắt đầu. Khi sử dụng nextLine , số được thêm từ bàn phím sẽ được đọc. Dưới đây chúng tôi có một hàm tạo mới để lưu bản đồ của chúng tôi , dữ liệu khách hàng. Map.put được sử dụng để lưu hoặc cập nhật dữ liệu khách hàng. khách hàng = khách hàng mới (firstName, LastName, địa chỉ, điện thoại, tên người dùng, mật khẩu, ngày mới());
bank.customerMap.put(username, customer);
Nếu có kết nối, chúng ta sẽ nhận được một menu mới với các tùy chọn. Cách tiếp cận tương tự hoạt động bằng cách sử dụng whilechuyển sang chức năng ứng dụng gọi. Giai đoạn 1: Thêm tiền vào tài khoản hiện tại của bạn. Bước 2: Hiển thị 5 giao dịch gần nhất. Giai đoạn 3: Chúng tôi xuất dữ liệu khách hàng từ thẻ ra bảng điều khiển. Bước 4: Đóng menu. Mã nguồn của chương trình có thể được tìm thấy ở đây . Tôi hy vọng ví dụ này sẽ giúp bạn làm quen hơn với việc sử dụng các khái niệm OOP trong Java.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION