Android设计模式:Builder创建者模式在Android中的应用,Dialog,StringBuilder
根据需要,进行创建。-----箴言-----
内容简介:
在实际使用创建者模式进行对象的创建时,经常利用“内部类”来进行对象的创建,耦合性比较低。
从两代码来看创建者模式在Android的实际体现和运用。
例子1:Dialog的创建:
代码如下:
在BroswerActivity.java中,有对WebViewClient的创建,代码如下:
private final WebViewClient mWebViewClient = new WebViewClient() {…… /** * Displays SSL error(s) dialog to the user. */ @Override public void onReceivedSslError( final WebView view, final SslErrorHandler handler, final SslError error) { …… new AlertDialog.Builder(BrowserActivity.this) .setTitle(R.string.security_warning) .setIcon(android.R.drawable.ic_dialog_alert) .setView(warningsView) .setPositiveButton(R.string.ssl_continue, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { handler.proceed(); } }) .setNeutralButton(R.string.view_certificate, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { showSSLCertificateOnError(view, handler, error); } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { handler.cancel(); BrowserActivity.this.resetTitleAndRevertLockIcon(); } }) .setOnCancelListener( new DialogInterface.OnCancelListener() { public void onCancel(DialogInterface dialog) { handler.cancel(); BrowserActivity.this.resetTitleAndRevertLockIcon(); } }) .show(); ……}
分析与说明:
(1)功能:正如注释中所示,创建一个error dialog并显示
(2)模式说明: 这里,使用了简化的builder模式,将抽象建造者省略,只使用一个具体建造者,并且将指导者角色也省略了。 AlertDialog.Builder就是具体建造者,另外,它是以匿名类的方式被创建的,而且,Builder类是AlertDialog的内部类,这样,耦合性比较低,这正是面向对象中要达到的设计意图之一。 最后调用show函数,它的返回类型正是我们要创建的产品,即AlertDialog。 所以,Builder(具体建造者)是AlertDialog(产品)的内部匿名类,用来创建并显示一个dialog。
(3)启示: 我们完全可以对builder模式进行简化,将抽象建造者甚至指导者角色省略。 具体创建者和产品之间可以用内部类来实现,以达到低耦合的目的。
例子2:String对象的创建者模式的体现:StringBuilder,StringBuffer
示例代码:
public class DefaultHttpClientConnection extends SocketHttpClientConnection {…… public String toString() { StringBuffer buffer = new StringBuffer(); buffer.append("["); if (isOpen()) { buffer.append(getRemotePort()); } else { buffer.append("closed"); } buffer.append("]"); return buffer.toString();}}
分析:
(1)功能:StringBuffer和StringBuilder是包含在java.lang包中的。
(2)模式说明:
• 这里,使用了简化的builder模式,将指导者角色省略。
• builder模式被用于实现DefaultHttpClientConnection的成员函数toString。
• 最后的return buffer.toString()其实返回的就是产品String。
(3)启示:
• 完全可以用builder模式去实现一个类的成员函数。