奔跑的肥猪

导航

一个新的获取对象实例的方法

工厂模式提供方法来创建对象,但是在factory中看到那一堆if/else就比较头痛,心想是不是

可以让相关的对象统一继承一个接口,将key 值和对象放在一个map里面,取对象是直接从

map里面取呢?

1. 首先建立一个action类

package com.fp.app;

import java.util.HashMap;

public class Action {


	private final HashMap<String, BookDetailAction> myIdToActionMap = new HashMap<String, BookDetailAction>();

	protected final void addAction(String actionId, BookDetailAction action) {
		myIdToActionMap.put(actionId, action);
	}

	private final BookDetailAction getAction(String actionId) {
		return (BookDetailAction) myIdToActionMap.get(actionId);
	}


	public final boolean doAction(String actionId) {
		BookDetailAction action = getAction(actionId);
		if (action != null) {
			return action.run();
		} else
			return false;
	}
}

从代码中看到map用来存储key和BookDetailAction的实现类

在doaction取出实现类,执行run方法

2. ComposeBookDetailAction 为client给外部调用的入口

package com.fp.app;

abstract class BookDetailAction {
	protected ComposeBookDetailAction bookdetailAction;

	public BookDetailAction() {
		super();
	}

	BookDetailAction(ComposeBookDetailAction BookdetailAction) {
		bookdetailAction = BookdetailAction;
	}
	
	abstract protected boolean run();
	
}

3.

package com.fp.app;

import com.fp.app.model.GetContentInfoContentInfo;
import com.fp.app.model.SubscribeInfo;


public final class ComposeBookDetailAction extends Action {
	private GetContentInfoContentInfo contentinfo;
	private SubscribeInfo subscribeinfo;
	
	public GetContentInfoContentInfo getContentinfo() {
		return contentinfo;
	}
	public void setContentinfo(GetContentInfoContentInfo contentinfo) {
		this.contentinfo = contentinfo;
	}
	public SubscribeInfo getSubscribeinfo() {
		return subscribeinfo;
	}
	public void setSubscribeinfo(SubscribeInfo subscribeinfo) {
		this.subscribeinfo = subscribeinfo;
	}

	public ComposeBookDetailAction(GetContentInfoContentInfo contentinfo, SubscribeInfo subscribeinfo) {
		super();
		this.contentinfo = contentinfo;
		this.subscribeinfo = subscribeinfo;
		addAction(BookDetailActionCode.ADD_BOOKMARK, new AddBookmarkAction(this));
		addAction(BookDetailActionCode.DEL_BOOKMARK, new DelBookmarkAction(this));
	}

}

4.二个 BookDetailAction的实现类

package com.fp.app;

import com.fp.app.model.GetContentInfoContentInfo;
import com.fp.app.model.SubscribeInfo;


public class AddBookmarkAction  extends BookDetailAction {
	AddBookmarkAction(ComposeBookDetailAction BookdetailAction) {
		super(BookdetailAction);
	}

	@Override
	protected boolean run() {
		GetContentInfoContentInfo contentinfo = bookdetailAction.getContentinfo();
		System.out.println("add bookmark action"+contentinfo.getContentID());
		SubscribeInfo subscribeinfo = bookdetailAction.getSubscribeinfo();
		System.out.println("add bookmark action"+subscribeinfo.getFeeDescription());
		return false;
	}

}
package com.fp.app;

public class DelBookmarkAction extends BookDetailAction {

	DelBookmarkAction(ComposeBookDetailAction BookdetailAction) {
		super(BookdetailAction);
	}

	@Override
	protected boolean run() {
		
		System.out.println("del bookmark action");
		return false;
	}

}

5.client调用代码

package com.fp.app;

import com.fp.app.model.GetContentInfoContentInfo;
import com.fp.app.model.SubscribeInfo;


public class Test {

	private static ComposeBookDetailAction BookdetailAction;
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		if (BookdetailAction == null) {
			GetContentInfoContentInfo contentinfo =new GetContentInfoContentInfo();
			contentinfo.setContentID("123456");
			SubscribeInfo subscribeinfo = new SubscribeInfo();
			subscribeinfo.setFeeDescription("我们都是好人");
			BookdetailAction = new ComposeBookDetailAction(contentinfo,subscribeinfo);
			BookdetailAction.doAction(BookDetailActionCode.ADD_BOOKMARK);
		}


	}

}

posted on 2011-07-14 10:42  布兜兜  阅读(459)  评论(0编辑  收藏  举报