Модели для различных видов печати


Я пытаюсь рассчитать себестоимость печати на разных размерах бумаги, одиночная сторона или двойная сторона. Так вот эта деталь:

А4, тип задания односторонняя:
*15 копеек - черно-белая страница
*25 копеек - цвет страницы.

А4, тип работы двусторонняя:
*10 центов - черная и белая страница
*20 центов - цвет страницы.

Также потребуется поддержка других размеров бумаги будут добавлены в будущем.

И по моему проекту, разработчик может просто создать класс А5, например, для поддержки другой размер бумаги, и добавить условие в класс фабрики.

Может кто-то проверить мой код и помочь мне о том, я должен использовать интерфейс вместо абстрактного класса?

Вот мой код:

PageBase:

public abstract class PageBase {
    abstract double GetCost(int total, int color, boolean isSingleSide);
    abstract void CalculateUnitPrice(boolean isSingleSide);
}  

Класс A4Page:

public class A4Page extends PageBase {
    public double blackAndWhitePrintUnitCost;
    public double colorPrintUniCost;

    @Override
    public double GetCost(int total, int color, boolean isSingleSide) {
        CalculateUnitPrice(isSingleSide);
        return color* colorPrintUniCost + (total-color)* blackAndWhitePrintUnitCost;
    }

    @Override
    public void CalculateUnitPrice(boolean isSingleSide) {
        if (isSingleSide) {
            this.blackAndWhitePrintUnitCost = 0.15;
            this.colorPrintUniCost = 0.25;
        }
        else {
            this.blackAndWhitePrintUnitCost = 0.10;
            this.colorPrintUniCost = 0.20;
        }
    }
}  

PageFactory:

public class PageFactory {

    public PageBase GetPage(String pageType) {
        switch (pageType.toUpperCase()) {
            case "A4":
                return new A4Page();
            default:
                return new A4Page();
        }
    }
}

Главная:

public class Main {
    public static void Main() {
        //read
        PageFactory pageFactory = new PageFactory();
        PageBase page = pageFactory.GetPage("A4");
        page.GetCost(0,0,false);
    }
}


102
1
задан 1 марта 2018 в 03:03 Источник Поделиться
Комментарии
1 ответ

Дизайн

вы должны рассмотреть, чтобы определить свойства страницы в фабрику, вот где он должен быть расположен.

public PageBase GetPage(String pageType) {
switch (pageType.toUpperCase()) {
case "A4": return new Page(0.15, 0.25, 0.10, 0.20);
}

Программирование

1. Страницы

вы не должны пытаться подкласс страницы, так как это не требуется, единственное различие между каждой странице приведены цены (до сих пор). Поэтому вам не нужно подклассы - это просто страницы (не основной страницы или что-нибудь еще)

И даже больше, вы должны может instanciate класс со всеми свойствами во время строительства (как показано выше, внедрение зависимостей)

public class Page {

private final double blackWhiteSinglePageUnitCost;
private final double colorSinglePageUnitCost;
private final double blackWhiteDoublePageUnitCost;
private final double colorDoublePageUnitCost;

public Page(double bwSingle, double colorSingle, double bwDouble, double colorDouble){
blackWhiteSinglePageUnitCost= bwSingle;
colorSinglePageUnitCost= bwDouble;
blackWhiteDoublePageUnitCost= bwSingle;
colorDoublePageUnitCost= colorDouble;
}

что может быть Ист GetCost но следует переименовать в инт getCost() но вы можете полностью пропустить CalculateUnitPriceсмотрите ниже

2. Тип страницы

если вы используете определенный формат, вы должны использовать перечисления для определения формата листа. что бы освободить вас от злоупотребления строк в типы данных

enum PageType {A4, A5, LETTER }; 

3. принося вещи вместе

когда мы используем все эти намеки сверху надо отрегулировать немного больше кода, чтобы сделать программу запустить снова

Page.class должны быть изменены, мы можем посчитать цену на лету, потому что мы уже знаем, что необходимо для расчета цены:

public double getCost(int total, int color, boolean isSingleSided){
int bw = total - color;
if(isSingleSided){
return bw * blackWhiteSinglePageUnitCost + color * colorSinglePageUnitCost ;
else{
return bw * blackWhiteDoublePageUnitCost + color * colorDoublePageUnitCost ;
}

}

PageFactoryдолжен быть изменен - сначала метод подписи должен быть Java соответствовать, а именно: getPage не GetPage. затем вы переключаетесь на перечислимый тип, а не строку. Что позволяет обрабатывать недопустимые входы.

public Page getPage(PageType pageType) { 
switch (pageType) {
case PageType.A4:
return ...;
case PageType.A5:
return ...;
case PageType.LETTER:
return ...;
}
}

если вы используете это в действии (в main способ ) он будет наконец, что возникновение:

public class Main {
public static void Main() {
PageFactory pageFactory = new PageFactory();
Page page = pageFactory.getPage(PageType.A4);
double cost = page.getCost(0,0,false);
}
}

2
ответ дан 2 марта 2018 в 07:03 Источник Поделиться