三、實現 實在找不到太好的例子,我認為《java與模式》中發郵件的例子還算可以。這里我將《Think in Patterns with Java》中的例子放到這里權且充個門面。媒體可以存在不同的表達形式,比如書籍、雜志和網絡。這個例子表示不同形式的媒體構造的步驟是相似的,所以可以被提取到指導者角色中去。
import java.util.*; import junit.framework.*;
//不同的媒體形式:
class Media extends ArrayList {} class Book extends Media {} class Magazine extends Media {} class WebSite extends Media {}
// 進而不含不同的媒體組成元素:
class MediaItem { PRivate String s; public MediaItem(String s) { this.s = s; } public String toString() { return s; } }
class Chapter extends MediaItem { public Chapter(String s) { super(s); } }
class Article extends MediaItem { public Article(String s) { super(s); } }
class WebItem extends MediaItem { public WebItem(String s) { super(s); } }
// 抽象建造者角色,它規范了所有媒體建造的步驟:
class MediaBuilder { public void buildBase() {} public void addMediaItem(MediaItem item) {} public Media getFinishedMedia() { return null; } }
//具體建造者角色
class BookBuilder extends MediaBuilder { private Book b; public void buildBase() { System.out.println("Building book framework"); b = new Book(); }
public void addMediaItem(MediaItem chapter) { System.out.println("Adding chapter " + chapter); b.add(chapter); } public Media getFinishedMedia() { return b; } }
class MagazineBuilder extends MediaBuilder { private Magazine m; public void buildBase() { System.out.println("Building magazine framework"); m = new Magazine(); }
public void addMediaItem(MediaItem article) { System.out.println("Adding article " + article); m.add(article); } public Media getFinishedMedia() { return m; } }
class WebSiteBuilder extends MediaBuilder { private WebSite w; public void buildBase() { System.out.println("Building web site framework"); w = new WebSite(); }
public void addMediaItem(MediaItem webItem) { System.out.println("Adding web item " + webItem); w.add(webItem); }
public Media getFinishedMedia() { return w; } }
//指導者角色,也叫上下文 class MediaDirector { private MediaBuilder mb; public MediaDirector(MediaBuilder mb) { this.mb = mb; //具有策略模式相似特征的 }
public Media prodUCeMedia(List input) { mb.buildBase(); for(Iterator it = input.iterator(); it.hasNext();) mb.addMediaItem((MediaItem)it.next()); return mb.getFinishedMedia(); } };
//測試程序——客戶程序角色
public class BuildMedia extends TestCase { private List input = Arrays.asList(new MediaItem[] { new MediaItem("item1"), new MediaItem("item2"), new MediaItem("item3"), new MediaItem("item4"), });
public void testBook() { MediaDirector buildBook = new MediaDirector(new BookBuilder()); Media book = buildBook.produceMedia(input); String result = "book: " + book; System.out.println(result); assertEquals(result, "book: [item1, item2, item3, item4]"); }
public void testMagazine() { MediaDirector buildMagazine = new MediaDirector(new MagazineBuilder()); Media magazine = buildMagazine.produceMedia(input); String result = "magazine: " + magazine; System.out.println(result); assertEquals(result, "magazine: [item1, item2, item3, item4]"); }
public void testWebSite(){ MediaDirector buildWebSite = new MediaDirector(new WebSiteBuilder()); Media webSite = buildWebSite.produceMedia(input); String result = "web site: " + webSite; System.out.println(result); assertEquals(result, "web site: [item1, item2, item3, item4]"); }
public static void main(String[] args) { junit.textui.TestRunner.run(BuildMedia.class); }