使用场景

需要保存某个场景在某个时刻的状态 一个对象不希望外界直接访问其内部对象,可以通过一个中介访问其内部对象

栗子:

public class NoteEditText extends EditText{
	//笔记本编辑类
	public NoteEditText(Context context) {
	super(context);
	// TODO Auto-generated constructor stub
}

public Memote createMemote(){
	Memote memote=new Memote();
	memote.text=this.getText().toString();
	memote.cursor=getSelectionStart();
	return memote;
}

public void restore(Memote memote){
	setText(memote.text);
	setSelection(memote.cursor);
}
}

//备忘录
public class Memote {
  public String text;
  public int cursor;
}

//负责管理memote对象
public class NoteCaretaker {
	private static final int MAX=20;
	ArrayList<Memote> mList=new ArrayList<Memote>(MAX);
	int index=0;
public void savseMemote(Memote memote){
	if(mList.size()>MAX){
		mList.remove(0);
	}
mList.add(memote);
index=mList.size()-1;
}

public Memote getPreMemote(){
	index=index>0?--index:index;
	return mList.get(index);
}
public Memote getNextMemote(){
	index=index<mList.size()-1?++index:index;
	return mList.get(index);
}
}

//主函数调用
public class MainActivity extends ActionBarActivity {

NoteEditText noteEditText;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  NoteCaretaker noteCaretaker=new NoteCaretaker();

  @OnClick(R.id.lastButton)
	public void onClick(View v) {
		// TODO Auto-generated method stub
	     noteEditText.restore(noteCaretaker.getPreMemote()));
	}

	@OnClick(R.id.saveButton)
	public void nextMemote() {
		// TODO Auto-generated method stub
		noteEditText.restore(noteCaretaker.getNextMemote());
	}
	@OnClick(R.id.saveButton)
	public void saveNote(){
		noteCaretaker.savseMemote(noteEditText.createMemote());
	}
  }
}
  • 优点:提供可恢复的状态,方便回退
  • 缺点:类的成员过多,会占用大量资源