javaディエバモードの実例について詳しく説明します。


javaディエバモードの実例について詳しく説明します。
今日は818設計モードの中のローズマリーモードで、java中Stock、List、Setなどのインターフェースと配列というデータ構造のいずれも使うモードです。
まず、なぜローズマリーモードを使用するのかというと、一般的な反復方法によって、stack、list、setおよび配列の異なる遍歴の詳細を隠すことが目的です。つまり、私は容器を通して私の方法を呼び出す人にこれらの要素を知ってもらいたくないです。どのようにしてこれらの要素を獲得しているのかを教えてください。これにより、実装の詳細を最大化することができ、パッケージの変更ができます。
まずは一つの例を通して、その重要性を一歩ずつ理解していきましょう。例えば、私はプラットフォームを開発したいです。このプラットフォームは京東の注文書とタオバオの注文書を取って、注文書の中の全部の購買項目をプリントアウトします。
注文書の中のすべての項目を印刷するなら、まずこれらの項目、つまり注文項目にはどのような属性がありますか?

package iterator;

/**
 * 
* @ClassName: Item 
* @Description:    
* @author minjun
*
 */
public class Item {

 /**    */
 private String name;
 
 /**  */
 private double price;
 
 /**  */
 private String desc;
 
 /**  */
 private int count;

 public Item(String name, double price, String desc, int count) {
 this.name = name;
 this.price = price;
 this.desc = desc;
 this.count = count;
 }

 public String getName() {
 return name;
 }

 public void setName(String name) {
 this.name = name;
 }

 public double getPrice() {
 return price;
 }

 public void setPrice(double price) {
 this.price = price;
 }

 public String getDesc() {
 return desc;
 }

 public void setDesc(String desc) {
 this.desc = desc;
 }

 public int getCount() {
 return count;
 }

 public void setCount(int count) {
 this.count = count;
 }

 @Override
 public String toString() {
 return "Item [name=" + name + ", price=" + price + ", desc=" + desc
  + ", count=" + count + "]";
 }
}

この項目が分かりました。京東とタオバオはどうやってこれらを保存するのかを見たいです。そこで私は劉強東と馬雲に聞きましたが、京東は集合Listで保存していると知っています。便利なので、タオバオは配列で保存しています。彼らは格納容器を変更したくないです。大きすぎるためです。
この時、もし伝統的な考えを使うならば、ok、私は京東のListを持ってきて、for循環とlist.get(i)を通じて中のすべての項目を取って印刷します。タオバオのarrayを手に入れて、for循環とarray[i]で中の項目を取ってプリントします。叶えられますか?確かにいいですが、このようにすれば、各容器ごとに違う印刷方法を実現します。今は2つの方がいいですが、もしまた誰か来たら、チェーンで容器を実現します。また反復チェーンを追加する方法がありますか?もちろんいいです。面倒くさいからです。そこで、私は考えがあります。考え方はこうです。
京東の注文とタオバオの注文は全部便利に中の元素を遍歴できるようにしたいです。遍歴の方法は公共の方法で処理できます。前のように別々に処理します。この考え方に基づいて、TDD(テストドライブ開発)でステップを実行します。まずテストコードを書いてください。まず注文インターフェースがあります。中には二つのサブオーダーがあります。

package iterator;

import org.junit.Test;

public class TestCase {

 @Test
 public void test() {
 Order o = 
  new TBOrder();//     
//  new JDOrder();//     
 printOrder(o);//    

 }

 /**     */
 private void printOrder(Order o) {
 for (Item item : o) {
  System.out.println(item);
 }
 }
}

上記のようにプリントできたら、どんなに便利ですか?タオバオの注文書を変えたらタオバオの注文を繰り返して実現します。京東の注文書に変えて、京東の注文書を使って実現します。テストコードでは詳細に注意する必要はありません。今は、どのような方法でこの注文書Orderのすべての項目を直接印刷できたら、私の上記のコードが完全に実現できると思います。つまり私は注文が必要です。遍歴できます。どうすればいいですか?実はjavaの中でこのようなインターフェースを提供しました。Iterableです。もし私の注文が全部このインターフェースを実現したら、私の注文は自然にfor eachサイクルを通して中身を遍歴することができます。

/*
 * %W% %E%
 *
 * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

package java.lang;

import java.util.Iterator;

/** Implementing this interface allows an object to be the target of
 * the "foreach" statement.
 * @since 1.5
 */
public interface Iterable<T> {

  /**
   * Returns an iterator over a set of elements of type T.
   * 
   * @return an Iterator.
   */
  Iterator<T> iterator();
}

上はjavaのIterableインターフェースで、下は私自身の注文インターフェースで、Iterableインターフェースを継承しました。

package iterator;

public interface Order extends Iterable<Item>{

}

上のOrder注文インターフェースはIterableインターフェースを継承した後に、同様に抽象的な方法iteratorを継承してきました。この抽象的な方法こそ、Iterableの根本的な実現案である。私たちはサブオーダーでそれぞれこのインターフェースを実現して京東と淘宝の異なる反復プログラムを提供します。
京の東

package iterator;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 
 * @ClassName: JDOrder
 * @Description:     
 * @author minjun
 * 
 */
public class JDOrder implements Order {

 /**           */
 private List<Item> list = new ArrayList<Item>();

 public JDOrder() {
 add("iphone6", 5000.00, "    ", 2);
 add("mbp", 16000.00, "    ", 1);
 add("      ", 3000.00, "     ", 3);
 }

 /**        */
 public void add(String name, double price, String desc, int count) {
 list.add(new Item(name, price, desc, count));
 }

 @Override
 public Iterator<Item> iterator() {
 return new MyIterator();
 }

 private class MyIterator implements Iterator<Item> {

 private Iterator<Item> it = list.iterator();

 @Override
 public boolean hasNext() {
  return it.hasNext();
 }

 @Override
 public Item next() {
  return it.next();
 }

 @Override
 public void remove() {
  throw new UnsupportedOperationException("         ");
 }

 }
}

宝を洗う

package iterator;

import java.util.Iterator;
import java.util.NoSuchElementException;

/**
 * 
* @ClassName: TBOrder 
* @Description:      
* @author minjun
*
 */
public class TBOrder implements Order{
 
 private int size=3;

 private Item[] orders=new Item[size];
 
 private int index=0;
 
 public TBOrder(){
 add("  1", 1111, "    1", 1);
 add("  2", 1111, "    1", 1);
 add("  3", 1111, "    1", 1);
 add("  4", 1111, "    1", 1);
 add("  5", 1111, "    1", 1);
 add("  6", 1111, "    1", 1);
 add("  7", 1111, "    1", 1);
 add("  8", 1111, "    1", 1);
 }
 
 /**      */
 public void add(String name, double price, String desc, int count) {
 
 //        ,   
 if(index>=size-1){
  resize();
 }
  
 orders[index++]=new Item(name, price, desc, count);
 }
 
 /**  */
 private void resize() {
 size=size<<1;//     --   size=size*2
 Item[] newItems=new Item[size];
 //               
 for(int i=0;i<orders.length;i++){
  newItems[i]=orders[i];
 }
 orders=newItems;
 }

 @Override
 public Iterator<Item> iterator() {
 return new MyIterator();
 }
 
 private class MyIterator implements Iterator<Item>{
 
 private int curr=0;

 @Override
 public boolean hasNext() {
  return orders[curr]!=null;
 }

 @Override
 public Item next() {
  if(hasNext()){
  return orders[curr++];
  }else{
  throw new NoSuchElementException("      ");
  }
 }

 @Override
 public void remove() {
  throw new UnsupportedOperationException("         ");
 }
 
 }

}

このように、私は一つの基準を提供して反復可能なOrder注文インターフェースを提供して、それから二つの異なる反復実現方案(京東、淘宝)を提供して、私達のテストクラスに内部の異なる容器を遮断できる具体的な実現の違いを提供しました。また、これもローズマリーモードの运用です。
総括:需要--異なる容器の異なる反復方式、改良--同じ反復方式を利用して処理し、異なる実現細部をそれぞれ容器自身の実現に隠す。Iterableインターフェースと内部のIterator方法を実現して、自分の反復方式を実現します。
読んでくれてありがとうございます。みなさんのご協力をお願いします。ありがとうございます。