디자인 모드 3 차 작업

10906 단어
디자인 모드 3 차 작업
github 주소
1. 요구: 특정한 상품 관리 시스템 의 상품 이름 은 문자열 배열 에 저장 되 어 있 습 니 다. 현재 양 방향 교체 기 (MyIterator) 를 사용자 정의 하여 이 상품 이름 배열 의 양 방향 (앞 과 뒤로) 을 옮 겨 다 녀 야 합 니 다.Iterator 모드 로 디자인 되 었 습 니 다.
github 주소
아 날로 그:
원본 코드:
public interface MyIterator {
    boolean prev();
    boolean next();
    String curItem();
}
public interface ProductList {
    MyIterator getIterator();
}
public class MyProductList implements ProductList{
    private String[] products;

    public MyProductList(String[] products) {
        this.products = products;
    }

    @Override
    public MyIterator getIterator() {
        return new MyProductListIterator();
    }

    private class MyProductListIterator implements MyIterator{
        private int curIndex = 0;

        @Override
        public boolean prev() {
            boolean hasPrev = curIndex > 0;
            if(hasPrev){
                --curIndex;
            }
            return hasPrev;
        }

        @Override
        public boolean next() {
            boolean hasNext = curIndex < products.length -1;
            if(hasNext){
                ++curIndex;
            }
            return hasNext;
        }

        @Override
        public String curItem() {
            return products[curIndex];
        }
    }

}

2. 한 회 사 는 윈도 플랫폼 을 기반 으로 하 는 게시판 시스템 을 개발 하고 자 합 니 다. 시스템 은 메 인 메뉴 (Menu) 에 메뉴 항목 (Menu Item) 이 있 습 니 다.메뉴 클래스 의 addMenu Item () 방법 으로 메뉴 항목 을 추가 합 니 다.메뉴 항목 을 여 는 방법 은 click () 입 니 다. 메뉴 항목 마다 추상 적 인 명령 클래스 가 포함 되 어 있 습 니 다. 구체 적 인 명령 클래스 는 OpenCommand (), Create Command (), EditCommand () 등 을 포함 하고 명령 클래스 는 하나의 execute () 방법 을 가지 고 있 으 며 게시판 시스템 인터페이스 클래스 (BoardScreen () 의 open (), create (), edit () 등 을 호출 하 는 데 사 용 됩 니 다. Command 모드 를 사용 하여 설계 합 니 다.
github 주소
아 날로 그:
원본 코드:
public class BoardScreen {
    private Menu menu;

    public BoardScreen(Menu menu) {
        this.menu = menu;
    }

    public Menu getMenu() {
        return menu;
    }

    public void open(){
        System.out.println("BoardScreen open");
    }
    public void create(){
        System.out.println("BoardScreen create");
    }
    public void edit(){
        System.out.println("BoardScreen edit");
    }
}
public class Menu {
    private List menuItemList = new ArrayList();

    public void addMenuItem(MenuItem menuItem){
        menuItemList.add(menuItem);
    }

    public void clickAllItems(){
        for (MenuItem menuItem :menuItemList) {
            menuItem.click();
        }
    }
}
public class MenuItem {
    private String name;
    private Command command;

    public MenuItem(String name, Command command){
        this.name = name;
        this.command = command;
    }

    public void click(){
        System.out.print("click the menuItem["+name+"]"+" and ");
        command.execute();
    }
}
public interface Command {
    void execute();
}
public class OpenCommand implements Command {
    private BoardScreen boardScreen;

    public OpenCommand(BoardScreen boardScreen) {
        this.boardScreen = boardScreen;
    }

    @Override
    public void execute() {
        boardScreen.open();
    }
}
public class EditCommand implements Command {
    private BoardScreen boardScreen;

    public EditCommand(BoardScreen boardScreen) {
        this.boardScreen = boardScreen;
    }

    @Override
    public void execute() {
        boardScreen.edit();
    }
}
public class CreateCommand implements Command {
    private BoardScreen boardScreen;

    public CreateCommand(BoardScreen boardScreen) {
        this.boardScreen = boardScreen;
    }

    @Override
    public void execute() {
        boardScreen.create();
    }
}
public class BoardScreenTest {
    private BoardScreen boardScreen;

    @Before
    public void init(){
        boardScreen = new BoardScreen(new Menu());
        boardScreen.getMenu().addMenuItem(new MenuItem("openMenuItem", new OpenCommand(boardScreen)));
        boardScreen.getMenu().addMenuItem(new MenuItem("createMenuItem", new CreateCommand(boardScreen)));
        boardScreen.getMenu().addMenuItem(new MenuItem("editMenuItem", new EditCommand(boardScreen)));
    }

    @Test
    public void test(){
        boardScreen.getMenu().clickAllItems();
    }
}

3. 모 커 뮤 니 티 시스템 은 가상 채 팅 방 을 추가 하여 커 뮤 니 티 회원 이 해당 채 팅 방 을 통 해 정보 교 류 를 할 수 있 도록 하고 일반 회원 (CommonMember) 은 다른 회원 에 게 텍스트 메 시 지 를 보 낼 수 있 으 며 다이아몬드 회원 (Diamond Member) 은 다른 회원 에 게 텍스트 와 이미지 메 시 지 를 보 낼 수 있 습 니 다. 이 채 팅 방 은 'TMD' 와 같은 고상 하지 않 은 문 자 를 걸 러 낼 수 있 습 니 다.등 문 자 는 보 내 는 그림 의 크기 를 조절 할 수 있 습 니 다. Mediator 모드 로 디자인 할 수 있 습 니 다.
github 주소
아 날로 그:
원본 코드:
public abstract class Member {
    private String name;
    private AbstractChatRoom chatRoom;

    public Member(String name) {
        this.name = name;
    }

    public void setChatRoom(AbstractChatRoom chatRoom) {
        this.chatRoom = chatRoom;
    }

    public String getName() {
        return name;
    }

    public void sendText(Member to, String text){
        chatRoom.sendText(this, to, text);
    }

    public void sendImage(Member to, String image){
        chatRoom.sendImage(this, to, image);
    }
}
public class CommonMember extends Member{
    public CommonMember(String name) {
        super(name);
    }

    @Override
    public void sendImage(Member to, String image) {
        System.out.println("you need to upgrade to diamond member");
    }
}
public class DiamondMember extends Member {
    public DiamondMember(String name) {
        super(name);
    }
}
public class AbstractChatRoom {
    public void register(Member member){
        member.setChatRoom(this);
    }

    public void sendText(Member from, Member to, String text){
        System.out.println(from.getName() +" to " + to.getName() +" : text("+text+")");
    }
    public void sendImage(Member from, Member to, String image){
        System.out.println(from.getName() +" to " + to.getName() +" : image("+image+")");
    }
}
public class ChatRoom extends AbstractChatRoom{
    @Override
    public void sendText(Member from, Member to, String text) {
        super.sendText(from, to, filterText(text));
    }

    @Override
    public void sendImage(Member from, Member to, String image) {
        if(imageCheck(image)){
            super.sendImage(from, to, image);
        }
    }

    protected String filterText(String text){
        return text.replace("TMD", "***");
    }

    protected boolean imageCheck(String image){
        return image.length() < 4;
    }
}
public class ChatRoomTest {
    private Member a;
    private Member b;

    @Before
    public void inti(){
        a = new CommonMember("commonMember");
        b = new DiamondMember("diamondMember");
        AbstractChatRoom chatRoom = new ChatRoom();
        chatRoom.register(a);
        chatRoom.register(b);
    }

    @Test
    public void test(){
        a.sendText(b, "TMD! b");
        a.sendImage(b, "i1");
        b.sendText(a, "TMD! a");
        b.sendImage(a, "i1sdfasdf");
        b.sendImage(a, "i1");
    }
}

4. 요구 사항: 인터넷 서점 을 설계 하여 시스템 에 있 는 모든 컴퓨터 도서 (Computer Book) 를 한 권 에 10% 할인 하고 언어 도서 (LanguageBook) 는 한 권 에 2 위안 할인 하 며 소설 도서 (NovelBook) 는 100 위안 에 15 위안 할인 합 니 다. Strategy 모델 로 디자인 합 니 다.
github 주소
아 날로 그:
원본 코드:
public interface DiscountStrategy {
    public double discount(double price);
}
public class ComputerBookDiscount implements DiscountStrategy{
    @Override
    public double discount(double price) {
        return 0.9*price;
    }
}
public class LanguageBookDiscount implements DiscountStrategy{
    @Override
    public double discount(double price) {
        return price-2;
    }
}
public class NovelBookDiscount implements DiscountStrategy{
    @Override
    public double discount(double price) {
        return price-price/100*15;
    }
}
public class BookShop {
    private ComputerBookDiscount computerBookDiscount;
    private LanguageBookDiscount languageBookDiscount;
    private NovelBookDiscount novelBookDiscount;

    public void setComputerBookDiscount(ComputerBookDiscount computerBookDiscount) {
        this.computerBookDiscount = computerBookDiscount;
    }

    public void setLanguageBookDiscount(LanguageBookDiscount languageBookDiscount) {
        this.languageBookDiscount = languageBookDiscount;
    }

    public void setNovelBookDiscount(NovelBookDiscount novelBookDiscount) {
        this.novelBookDiscount = novelBookDiscount;
    }

    public double showPrice(Book book){
        double price = book.getPrice();
        if(book instanceof ComputerBook){
            price = computerBookDiscount.discount(price);
        }else if(book instanceof LanguageBook){
            price = languageBookDiscount.discount(price);
        }else if(book instanceof NovelBook){
            price = novelBookDiscount.discount(price);
        }

        System.out.println(book.getClass().getSimpleName()+"  orig:"+book.getPrice()+"  now:"+price );

        return price;
    }
}
public class Book {
    private double price;

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}
public class ComputerBook extends Book {
}
public class LanguageBook extends Book {
}
public class NovelBook extends Book {
}
public class BookShopTest {
    private BookShop bookShop;

    @Before
    public void init(){
        bookShop = new BookShop();
        bookShop.setComputerBookDiscount(new ComputerBookDiscount());
        bookShop.setLanguageBookDiscount(new LanguageBookDiscount());
        bookShop.setNovelBookDiscount(new NovelBookDiscount());
    }

    @Test
    public void test(){
        Book computerBook = new ComputerBook();
        computerBook.setPrice(200);
        Book languageBook = new LanguageBook();
        languageBook.setPrice(200);
        Book novelBook = new NovelBook();
        novelBook.setPrice(200);

        bookShop.showPrice(computerBook);
        bookShop.showPrice(languageBook);
        bookShop.showPrice(novelBook);
    }
}

좋은 웹페이지 즐겨찾기