728x90
MVC 패턴을 이용한 자판기 프로그램
Model
VO
음료(상품)들을 정의함
멤버변수로 PK(Primary Key), 이름(상품명), 재고, 가격을 가지고 있음
package model;
// 웹 개발에서, 일반적으로 기본 생성자를 사용하여 VO를 생성(new)
public class ProductVO {
private int num; // PK
private String name; // 상품명
private int cnt; // 재고
private int price; // 가격
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getCnt() {
return cnt;
}
public void setCnt(int cnt) {
this.cnt = cnt;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "ProductVO [num=" + num + ", name=" + name + ", cnt=" + cnt + ", price=" + price + "]";
}
}
DVO
데이터베이스를 대체하여 배열리스트를 사용
배열의 전체를 반환받는 selectAll과 하나의 객체만 반환받는 selectOne
소비자가 사용하는 상품구매, 관리자가 사용하는 상품추가, 재고추가, 상품삭제 메서드 존재
package model;
import java.util.ArrayList;
// CRUD
public class ProductDAO {
// DB를 대체하는 컬렉션(배열리스트)
ArrayList<ProductVO> datas;
private int pk=101; // pk값
public ProductDAO() { // 초기 데이터, 샘플 데이터
datas=new ArrayList<ProductVO>();
ProductVO vo = new ProductVO(); // 샘플 1
vo.setNum(pk++);
vo.setName("콜라");
vo.setPrice(1200);
vo.setCnt(0);
datas.add(vo);
ProductVO vo2 = new ProductVO(); // 샘플 2
vo2.setNum(pk++);
vo2.setName("사이다");
vo2.setPrice(900);
vo2.setCnt(5);
datas.add(vo2);
ProductVO vo3 = new ProductVO(); // 샘플 3
vo3.setNum(pk++);
vo3.setName("환타");
vo3.setPrice(800);
vo3.setCnt(2);
datas.add(vo3);
}
public ArrayList<ProductVO> selectAll(ProductVO vo) { // getAll()
// V측에서 무엇을 필요로할지 고려!
System.out.println(" 로그: selectAll()");
return datas;
}
public ProductVO selectOne(ProductVO vo) { // getOne()
for(int i=0;i<datas.size();i++) {
if(vo.getName().equals(datas.get(i).getName())) {
System.out.println(" 로그: "+datas.get(i)+" 반환");
return datas.get(i);
}
}
System.out.println(" 로그: 반환xxx -> 확인필요!");
return null;
}
public boolean BuyProduct(ProductVO vo) { // 상품 구매 - 소비자
if(vo.getCnt()==0) {
System.out.println(" 로그: "+vo.getNum()+" 재고가 없습니다.");
return false;
}
vo.setCnt(vo.getCnt()-1);
System.out.println(" 로그: "+vo.getNum()+" 구매완료!");
return true;
}
public boolean insert(ProductVO vo) { // 상품 생성 - 관리자
try {
vo.setNum(pk++); // 상품이 새로 추가되면 pk값 부여
datas.add(vo);
System.out.println(" 로그: 메뉴추가성공!");
return true;
}catch(Exception e) {
System.out.println(" 로그: 메뉴추가실패: 확인이 필요한 예외발생!");
e.printStackTrace();
return false;
}
}
public boolean update(ProductVO vo) { // 재고추가 - 관리자
for(int i=0;i<datas.size();i++) {
if(datas.get(i).getNum()==vo.getNum()) {
datas.get(i).setCnt(datas.get(i).getCnt()+vo.getCnt());
return true;
}
}
return false;
}
public boolean delete(ProductVO vo) { // 상품 삭제 - 관리자
for(int i=0;i<datas.size();i++) {
if(datas.get(i).getNum()==vo.getNum()) {
datas.remove(i);
return true;
}
}
return false;
}
}
View
package view;
import java.util.ArrayList;
import java.util.Scanner;
import model.ProductVO;
public class ProductView {
Scanner sc=new Scanner(System.in);
public int action;
public void startView() {
while(true) { // 유효성 검사 -> 꼼꼼하게 작업해보기!
System.out.println("=== 자판기 ===");
System.out.println("1.메뉴확인 2.구매 3.종료");
System.out.print("입력) ");
action=sc.nextInt();
if((1<=action&&action<=3) || action==1234) {
break;
}
System.out.println("범위외입력!");
}
}
public void func1(ArrayList<ProductVO> datas) { // 메뉴확인시 출력
for(int i=0;i<datas.size();i++) {
System.out.println((i+1)+"번메뉴 "+datas.get(i).getName());
}
}
public void func2(ArrayList<ProductVO> datas) { // 구매시 출력
for(int i=0;i<datas.size();i++) { // 메뉴출력 로직
System.out.print((i+1)+"번메뉴 ");
if(datas.get(i).getCnt()==0) { // 재고가 없으면 X
System.out.println("X");
continue;
}
System.out.println(datas.get(i).getName());
}
while(true) { // 주문 로직
System.out.print("메뉴입력) ");
action=sc.nextInt();
if(1<=action && action<=datas.size()) {
break;
}
System.out.println("상품번호 확인후 다시입력해주세요!");
}
}
public void funcT(ProductVO vo) { // 구매 성공
System.out.println(vo.getName()+" 구매완료!");
}
public void funcF(ProductVO vo) { // 구매 실패
System.out.println(vo.getName()+" 재고가 없습니다...");
}
public void func3() { // 프로그램 종료
System.out.print("프로그램이 종료됩니다");
for(int i=0;i<5;i++) {
System.out.print(".");
// try {
// Thread.sleep(1000); // 1000==1초
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
System.out.println();
}
public void admin_func1() { // 관리자모드 입장시 출력
while(true) {
System.out.println("=== 관리자 모드 ===");
System.out.println("1.음료추가 2.재고추가 3.음료삭제 4.관리자모드 종료");
System.out.print("입력) ");
action=sc.nextInt();
if(1<=action&&action<=4) {
break;
}
System.out.println("범위외입력!");
}
}
public void admin_func2() { // 음료추가
System.out.println("음료추가 메뉴입니다.");
}
public String admin_func3() { // 음료이름입력
System.out.print("음료 이름을 입력) ");
String name=sc.next();
return name;
}
public int admin_func4() { // 음료가격입력
System.out.print("음료 가격을 입력) ");
int price=sc.nextInt();
return price;
}
public int admin_func5() { // 음료재고입력
System.out.print("음료 재고를 입력) ");
int cnt=sc.nextInt();
return cnt;
}
public void admin_func6() { // 수행이 완료되었습니다!
System.out.println("수행이 완료되었습니다!");
}
public void admin_func7() { // 수행실패! 다음에 다시 이용해주세요...
System.out.println("수행실패! 다음에 다시 이용해주세요...");
}
public void admin_func8() { // 음료재고추가
System.out.println("음료재고추가 메뉴입니다.");
}
public int admin_func9() { // 번호입력
System.out.print("번호 입력) ");
int num=sc.nextInt();
return num;
}
public void admin_func10() { // 음료삭제
System.out.println("음료삭제 메뉴입니다.");
}
}
Controller
package controller;
import java.util.ArrayList;
import model.ProductDAO;
import model.ProductVO;
import view.ProductView;
public class ProductController {
ProductDAO model;
ProductView view;
public ProductController() {
model=new ProductDAO();
view=new ProductView();
}
public void startApp() {
while(true) {
view.startView();
if(view.action==1) {
ProductVO vo= new ProductVO();
view.func1(model.selectAll(vo));
}
else if(view.action==2) {
ProductVO vo= new ProductVO();
view.func2(model.selectAll(vo)); // 상품구매
/*C에서는 사용자가 입력한 메뉴의 번호를 view.action으로 참조가능하고,
M은 pk를 입력받으면 상품객체를 줄 준비가 되어있음.
*/
ArrayList<ProductVO> data = model.selectAll(vo);
int num=view.action-1; // V에서 사용자가 입력한 메뉴번호. pk(인덱스)
// pk를 넣으면 해당하는 상품을 반환하는 M의 selectOne()메서드
boolean flag=model.BuyProduct(model.selectOne(data.get(num)));
// M은 반환받은(==사용자가 선택한) 객체의 재고를 --
/// model.update(model.selectOne(view.action+100));
if(flag) {
view.funcT(data.get(num));
}
else {
view.funcF(data.get(num));
}
}
else if(view.action==3) {
view.func3();
break;
}
else if(view.action==1234) {
// 관리자 모드
while(true) {
view.admin_func1();
if(view.action==1) {
view.admin_func2();
ProductVO vo = new ProductVO();
vo.setName(view.admin_func3()); // 이름 등록
vo.setPrice(view.admin_func4()); // 가격 등록
vo.setCnt(view.admin_func5()); // 재고 등록
if(model.insert(vo)) {
view.admin_func6();
}
else {
view.admin_func7();
}
}
else if(view.action==2) {
view.admin_func8();
ProductVO vo = new ProductVO();
view.func1(model.selectAll(vo));
vo.setNum(view.admin_func9()+100); // 상품 번호 입력
vo.setCnt(view.admin_func5()); // 재고 추가
if(model.update(vo)) {
view.admin_func6();
}
else {
view.admin_func7();
}
}
else if(view.action==3) {
view.admin_func10();
ProductVO vo = new ProductVO();
vo.setNum(view.admin_func9()+100);
if(model.delete(vo)) {
view.admin_func6();
}
else {
view.admin_func7();
}
}
else if(view.action==4) {
view.func3();
break;
}
}
}
}
}
}728x90
'Java > study' 카테고리의 다른 글
| DDL / DML / DCL (0) | 2022.07.03 |
|---|---|
| DBMS 활용을 위해 Eclips에 Oracle 연동하기 (0) | 2022.07.01 |
| DAO / VO / DTO (0) | 2022.06.29 |
| MVC(Model, View, Controller) 패턴 (0) | 2022.06.28 |
| 파일입출력 (0) | 2022.06.27 |