java中のローズマリーの使い方を詳しく説明します。

8557 ワード

java中のローズマリーの使い方を詳しく説明します。
前言:
 ローズマリーモードは、一つのセットをカプセル化し、主にユーザーに内部要素を巡回する方法を提供する。ローズマリーモードは2つの利点があります。①ユーザーに遍歴的な方法を提供し、その内部実装の詳細を暴露していません。②要素間の遊離の責任は、集合体ではなく、集合体に委ねられ、ユーザと重合対象との間の結合が実現される。
      ローズマリーモードは、主にIteratorインターフェースを通じて1つの統合対象を管理していますが、ユーザが使用する場合は、Iteratorタイプのオブジェクトを得るだけで、その統合対象への遍歴が完了します。ここでの重合対象とは、一般的には、ArayList、LinkdList、および1つ下の階層が配列などの同じまたは類似した特性のグループを持つオブジェクトを指す。集合体のエルゴードは、集合体モードによって主にIteratorインターフェースのnext()、has Next()方法によって行われ、ここでnext()方法は、現在エルゴードポイントの要素値に戻ります。has Next()方法は、現在のエルゴードポイントの後に要素があるかどうかを特性評価します。Iteratorインターフェースには、現在のエルゴードポイントの要素を除去するremove()方法があります。一般的にこの方法を使用する必要はなく、現在の統合対象のエルゴードが動作をサポートしていない場合、いくつかの特殊な状況がこの方法を呼び出すことができる。
      ここでは、次の例を用いて、ディエゼルモードについて説明します。既存の2つのレストランの2つのセットのメニューは、配列を使用して実装され、もう一つのセットのメニューは、アラーリストを使用して実現されます。現在は二つのレストランの合併によって二つのメニューを統合する必要があります。両方のシェフはそれぞれのメニューの組み立て方式に慣れていますので、それぞれのメニュー様式を維持し続けたいです。しかし、従業員にとって、顧客のためにメニューを提供する場合は、二つのメニューによって、従業員の仕事の難しさが増してきます。また、後期に新しいレストランが合併して入ってくると、例えば、メニューの種類がHashMapであると、従業員がこのセットのメニューを維持することになります。従業員の需要によって、メニューリストが必要です。それぞれのメニュー類に向いているなら、きっと仕事の難易度が高くなります。また、メニュー類によって提供される方法も必ずしも従業員が必要とするものではありません。だから、従業員のニーズに応じて、メニューの規格を制定する必要があります。従業員が同じ方式で遍歴できるようにする。ここでは、ローズマリーモードを使用することができます。従業員はローズマリーインターフェースに向かって遍歴するだけでいいです。各料理人が持っているメニューはこのローズマリーを実現するだけでいいです。依然としてそれぞれの方式でメニュー項目を守ることができます。このようにして、異なるメニューと従業員の結合が実現されました。以下は、この問題を解決するために、ディエゼルモードを使用した具体的なコードです。
メニューインターフェース(主にディエゼルを作成する方法を含む):

public interface Menu<T> {
  Iterator<T> createIterator();
}
メニュー項目:

public class MenuItem {
  private String name;
  private String description;
  private boolean vegetarian;
  private double price;

  public MenuItem(String name, String description, boolean vegetarian, double price) {
    this.name = name;
    this.description = description;
    this.vegetarian = vegetarian;
    this.price = price;
  }

  public String getName() {
    return name;
  }

  public String getDescription() {
    return description;
  }

  public boolean isVegetarian() {
    return vegetarian;
  }

  public double getPrice() {
    return price;
  }
}

メニュー類(メニュー項目の組み立て方式):

public class DinerMenu implements Menu<MenuItem> {
  private static final int MAX_ITEMS = 6;
  private int numberOfItems = 0;
  private MenuItem[] menuItems;

  public DinerMenu() {
    menuItems = new MenuItem[MAX_ITEMS];
    addItem("Vegetarian BLT", "(Fakin') Bacon with lettuce & tomato on whole wheat", true, 2.99);
    addItem("BLT", "Bacon with lettuce & tomato on whole wheat", false, 2.99);
    addItem("Soup of the day", "Soup of the day, with a side of potato salad", false, 3.29);
    addItem("Hotdog", "A hot dog, with saurkraut, relish, onions, topped with cheese", false, 3.05);
  }

  public void addItem(String name, String description, boolean vegetarian, double price) {
    MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
    if (numberOfItems >= MAX_ITEMS) {
      System.out.println("Sorry, menu is full, Can't add item to menu");
    } else {
      menuItems[numberOfItems] = menuItem;
      numberOfItems++;
    }
  }

  @Deprecated
  public MenuItem[] getMenuItems() {
    return menuItems;
  }

  public Iterator<MenuItem> createIterator() {
    return new DinerMenuIterator(menuItems);
  }
}
public class PancakeHouseMenu implements Menu<MenuItem> {
  private ArrayList<MenuItem> menuItems;

  public PancakeHouseMenu() {
    menuItems = new ArrayList<>();
    addItem("K&B's Pancake Breakfast", "Pancakes with scrambled eggs, and toast", true, 2.99);
    addItem("Regular Pancake Breakfast", "Pancakes with fried eggs, sausage", false, 2.99);
    addItem("Blueberry Pancakes", "Pancakes made with fresh blueberries", true, 3.49);
    addItem("Waffles", "Waffles, with your choice of blueberries or strawberries", true, 3.49);
  }

  public void addItem(String name, String description, boolean vegetarian, double price) {
    MenuItem menuItem = new MenuItem(name, description, vegetarian, price);
    menuItems.add(menuItem);
  }

  @Deprecated
  public ArrayList<MenuItem> getMenuItems() {
    return menuItems;
  }

  public Iterator<MenuItem> createIterator() {
    return menuItems.iterator();
  }
}

シーケンサインターフェース:

public interface Iterator<T> {
  boolean hasNext();
  T next();
}
ローズマリークラス:

public class DinerMenuIterator implements Iterator<MenuItem> {
  private MenuItem[] items;
  private int position = 0;

  public DinerMenuIterator(MenuItem[] items) {
    this.items = items;
  }

  @Override
  public boolean hasNext() {
    return position < items.length && items[position] != null;
  }

  @Override
  public MenuItem next() {
    return items[position++];
  }

  @Override
  public void remove() {
    if (position <= 0) {
      throw new IllegalStateException("You can't remove an item until you've done at least one next()");
    }

    if (items[position - 1] != null) {
      for (int i = position - 1; i < items.length - 1; i++) {
        items[i] = items[i + 1];
      }
      items[items.length - 1] = null;
    }
  }
}
public class PancakeHouseIterator implements Iterator<MenuItem> {
  private ArrayList<MenuItem> items;
  private int position = 0;

  public PancakeHouseIterator(ArrayList<MenuItem> items) {
    this.items = items;
  }

  @Override
  public boolean hasNext() {
    return position < items.size();
  }

  @Override
  public MenuItem next() {
    return items.get(position++);
  }
}

従業員:

public class Waitress {
  private Menu<MenuItem> pancakeHouseMenu;
  private Menu<MenuItem> dinerMenu;

  public Waitress(Menu<MenuItem> pancakeHouseMenu, Menu<MenuItem> dinerMenu) {
    this.pancakeHouseMenu = pancakeHouseMenu;
    this.dinerMenu = dinerMenu;
  }

  public void printMenu() {
    Iterator<MenuItem> pancakeIterator = pancakeHouseMenu.createIterator();
    Iterator<MenuItem> dinerIterator = dinerMenu.createIterator();
    System.out.println("MENU
----
BREAKFAST"); printMenu(pancakeIterator); System.out.println("
LUNCH"); printMenu(dinerIterator); } private void printMenu(Iterator<MenuItem> iterator) { while (iterator.hasNext()) { MenuItem menuItem = iterator.next(); System.out.print(menuItem.getName() + ", "); System.out.print(menuItem.getPrice() + " -- "); System.out.println(menuItem.getDescription()); } } }
      上のコードから分かるように、従業員は具体的なメニューに対してプログラミングしていません。メニューのローズマリーを作成するMenuインターフェースと一つのローズマリーインターフェースIteratorに依存してプログラミングしています。従業員は伝えられたのがどのような組み立て式のメニューなのかを知る必要はなく、この二つのインターフェースを実現するメニューオブジェクトを使って巡回すればいいです。これは変化を多态に依存してインタフェースを実现し、不変のインタフェース依存を目的として、従业员とメニューの组み合わせ方式の分离を実现します。
      ここで使用されるMenuは、JavaクラスライブラリのIterableインターフェースに相当し、その役割は、ローズマリーオブジェクトを作成することであり、IteratorインターフェースとJavaクラスライブラリのIteratorインターフェースは基本的に一致している。ここで説明する必要があるのは、実際には、クラスに対して、一つのクラスに対して、そのクラスのメンテナンス負担を増加させることである。クラスの基本的な方法は高凝集であり、いわゆる凝集は関連の完全な機能を実現することであり、反復器インターフェースは実際には完全な関連の機能でもある。したがって、このクラスのために、一つのクラスを可能にするためには、このクラスのために、2つのセットの機能を追加しました。このタイプは機能メンテナンスを行う時、両方を配慮する必要があります。Javaクラスライブラリにおいて、ArayListとLinkdListには、Listのすべての基本的なremove方法を提供しているだけでなく、ローズマリーが必要とするremove方法も提供されています。両者の統一を実現するためには、集合を遍歴しているときに、このような基本的なremoveまたはaddを呼び出すことができないなど、いくつかの約束をしなければなりません。
疑問があれば、メッセージをお願いします。あるいは、当駅のコミュニティで交流して討論してください。ありがとうございます。