[실습] Strategy 패턴 with Java

gimseonjin616·2021년 10월 18일
0

실습

목록 보기
2/5

Account 구현

클래스 다이어그램

소스코드

  • Account
import java.util.Date;

public abstract class Account {
    int balance = 0;
    int limits = 0;
    Date endDate = null;

    WithdrawBehavior withdrawBehavior;
    CalculateIntrestBehavior calculateIntrestBehavior;
    public int getBalance(){throw new UnsupportedOperationException();}
    public void deposit(int i){throw new UnsupportedOperationException();}
    public void withdraw(int i ){
        balance = withdrawBehavior.withdraw(i, balance, limits, endDate);
    }
    public int calculateIntrest(){
        return calculateIntrestBehavior.calculateIntrest(balance);
    }
}
  • CalculateIntrestBehavior
public interface CalculateIntrestBehavior {
    int calculateIntrest(int balance);
}
  • WithdrawBehavior
import java.util.Date;

public interface WithdrawBehavior {
    int withdraw(int i, int balance, int limits, Date endDate);
}
  • CalculateIntrestWithMinus
public class CalculateIntrestWithMinus  implements CalculateIntrestBehavior{
    @Override
    public int calculateIntrest(int balance) {
        if(balance >= 0){
            return 0;
        }
        return balance * -7;
    }
}
  • CalculateIntrestWithNomal
public class CalculateIntrestWithNomal implements CalculateIntrestBehavior{
    @Override
    public int calculateIntrest(int balance) {
        return balance * 3 / 100;
    }
}
  • CalculateIntrestWithSaving
public class CalculateIntrestWithSaving implements CalculateIntrestBehavior{
    @Override
    public int calculateIntrest(int balance) {
        return balance * 5 / 100;
    }
}
  • WithdrawWithMinus
import java.util.Date;

public class WithdrawWithMinus implements WithdrawBehavior{
    @Override
    public int withdraw(int i, int balance, int limits, Date endDate) {
        if(i <= balance + limits){
            int result = balance - i;
            System.out.println(i + "원이 출금됐습니다.");
            System.out.println("잔액  : " + result + "원");
            return result;
        }else{
            System.out.println("잔액이 부족합니다.");
            return balance;
        }
    }
}
  • WithdrawWithNomal
import java.util.Date;

public class WithdrawWithNomal implements WithdrawBehavior{
    @Override
    public int withdraw(int i, int balance, int limits, Date endDate) {
        if(i <= balance){
            int result = balance - i;
            System.out.println(i + "원이 출금됐습니다.");
            System.out.println("잔액  : " + result + "원");
            return result;
        }else{
            System.out.println("잔액이 부족합니다.");
            return balance;
        }
    }
}
  • WithdrawWithSaving
import java.util.Date;

public class WithdrawWithSaving implements WithdrawBehavior{
    @Override
    public int withdraw(int i, int balance, int limits, Date endDate) {
        if(endDate.before(new Date())){
            if(i <= balance){
                int result = balance - i;
                System.out.println(i + "원이 출금됐습니다.");
                System.out.println("잔액  : " + result + "원");
                return result;
            }else{
                System.out.println("잔액이 부족합니다.");
                return balance;
            }
        }else{
            System.out.println("아직 만기일이 아닙니다.");
            return balance;
        }
    }
}
  • Minus
public class Minus extends Account{

    public Minus(int balance, int limits){
        this.balance = balance;
        this.limits = limits;
        calculateIntrestBehavior = new CalculateIntrestWithMinus();
        withdrawBehavior = new WithdrawWithMinus();
    }

    public int getBalance(){
        return balance;
    }
}
  • Nomal
public class Nomal extends Account{

    public Nomal(int balance){
        this.balance = balance;
        calculateIntrestBehavior = new CalculateIntrestWithNomal();
        withdrawBehavior = new WithdrawWithNomal();
    }

    public int getBalance(){
        return balance;
    }
}
  • Saving
import java.util.Date;

public class Saving extends Account{

    public Saving(int balance, Date endDate){
        this.balance = balance;
        this.endDate = endDate;
        calculateIntrestBehavior = new CalculateIntrestWithSaving();
        withdrawBehavior = new WithdrawWithSaving();
    }

    public int getBalance(){
        return balance;
    }
}
  • AccountSimulator
public class AccountSimulator {
    public static void main(String[] args){
        Account account1, account2, account3;
        account1 = new Minus(10000,10000);
        account2 = new Nomal(10000);
        account3 = new Saving(10000, new Date(2022,5,1,20,0,0));

        account1.getBalance();
        account2.getBalance();
        account3.getBalance();

        System.out.println("이자 : " + account1.calculateIntrest() + "원");
        System.out.println("이자 : " + account2.calculateIntrest() + "원");
        System.out.println("이자 : " + account3.calculateIntrest() + "원");

        account1.withdraw(12000);
        account2.withdraw(5000);
        account3.withdraw(5000);
    }
}

실행 결과

profile
to be data engineer

0개의 댓글