背景: 有四种WebView 因为业务逻辑的不同被划分为四种类型,分别如下:
public static final int BROWSER_TYPE_INNER = 0;
public static final int BROWSER_TYPE_SIMPLE = 1;
public static final int BROWSER_TYPE_OUTER = 2;
public static final int BROWSER_TYPE_THIRD = 3;
这四种不同类型的业务逻辑分别放在不同的Handler
类,因此就会有四种Handler,为了统一接口和利于扩展,提供一个接口,这个接口为:IWebViewBusiness
,然后我们为了抽出业务逻辑部分,进一步理清代码逻辑,使用一个WebViewManager
类来管理。
具体的层次结构如下:
上面的继承关系比较简单,这里不再赘述了,下面重点看一下四个Handler的管理类
public class WebViewManager implements IWebViewBusiness{
}
通过这个管理类,在构造器中来生成不同的Handler
public WebViewManager(Context context , IWebViewUI webviewUI, int browserType){
this.mIWebViewUI = webviewUI;
switch(browserType ){
case BROWSER_TYPE_INNER :
mWebViewHandler = new InnerWebViewHandler(context, mIWebViewUI);
break;
case BROWSER_TYPE_OUTER :
mWebViewHandler = new OuterWebViewHandler(context, mIWebViewUI);
break;
case BROWSER_TYPE_SIMPLE :
mWebViewHandler = new SimpleWebViewHandler(context, mIWebViewUI);
break;
case BROWSER_TYPE_THIRD :
mWebViewHandler = new BrowserThirdHandler(context, mIWebViewUI);
break;
}
}
接着看一下在具体的WebViewFragment
或者WebViewActivity
等类似的UI类中如何去使用。
public class SuperFanliFragmentWebview extends BaseFragmentWebview {
}
在onCreate()生命周期中生成Manager实例,而这个Manager通过Type类型参数构造不同的Handler。
@Override
public void onCreate (Bundle savedInstanceState ) {
super.onCreate(savedInstanceState );
mWebViewManager = new WebViewManager(getActivity(), this, WebViewManager.BROWSER_TYPE_INNER );
mWebViewManager.onCreate(savedInstanceState );
}
至此结构抽象完成,仔细看看上面的实例,是不是很像下面的普通工厂模式:
上图简单的实例如下:
/************************************************
* Send接口 *
************************************************/
public interface Sender {
public void Send();
}
/************************************************
* Mail实现类 *
************************************************/
public class MailSender implements Sender {
@Override
public void Send() {
System.out.println("this is mailsender!");
}
}
/************************************************
* SMS实现类 *
************************************************/
public class SmsSender implements Sender {
@Override
public void Send() {
System.out.println("this is sms sender!");
}
}
/************************************************
* 普通工厂类 *
************************************************/
public class SendFactory {
public Sender produce(String type) {
if ("mail".equals(type)) {
return new MailSender();
} else if ("sms".equals(type)) {
return new SmsSender();
} else {
System.out.println("请输入正确的类型!");
return null;
}
}
}
测试Case
public class FactoryTest {
public static void main(String[] args) {
SendFactory factory = new SendFactory();
Sender sender = factory.produce("sms");
sender.Send();
}
}
普通工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要扩展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。
上图简单的实例如下:
/************************************************
* Send接口 *
************************************************/
public interface Sender {
public void Send();
}
/************************************************
* Mail实现类 *
************************************************/
public class MailSender implements Sender {
@Override
public void Send() {
System.out.println("this is mailsender!");
}
}
/************************************************
* SMS实现类 *
************************************************/
public class SmsSender implements Sender {
@Override
public void Send() {
System.out.println("this is sms sender!");
}
}
/************************************************
* 工厂接口 *
************************************************/
public interface Provider {
public Sender produce();
}
/************************************************
* Mail工厂实现类 *
************************************************/
public class SendMailFactory implements Provider {
@Override
public Sender produce(){
return new MailSender();
}
}
/************************************************
* SMS工厂实现类 *
************************************************/
public class SendSmsFactory implements Provider{
@Override
public Sender produce() {
return new SmsSender();
}
}
测试Case
public class Test {
public static void main(String[] args) {
Provider provider = new SendMailFactory();
Sender sender = provider.produce();
sender.Send();
}
}
其实这个模式的好处就是,如果你现在想增加一个功能:发及时信息,则只需做一个实现类,实现Sender接口,同时做一个工厂类,实现Provider接口,就OK了,无需去改动现成的代码。这样做,拓展性较好!
按照上面的抽象工厂,改造扩展更好的抽象工厂如下:
先定义上面所谓的Provider接口:
public interface WebViewHandlerProvider {
public IWebViewBusiness produce( final Context context , final IWebViewUI webviewBusiness );
}
接着定义其他几种类型的Handler的工厂类并实现这个接口:
/*****************************************************************************
* InnerWebView工厂实现类 *
*****************************************************************************/
public class InnerWebViewHandlerFactory implements WebViewHandlerProvider {
@Override
public IWebViewBusiness produce(Context context, IWebViewUI webviewBusiness) {
if (context == null || webviewBusiness == null ) {
return null ;
}
return new InnerWebViewHandler(context, webviewBusiness);
}
}
/*****************************************************************************
* OutWebView工厂实现类 *
*****************************************************************************/
public class OutWebViewHandlerFactory implements WebViewHandlerProvider {
@Override
public IWebViewBusiness produce(Context context, IWebViewUI webviewBusiness) {
if (context == null || webviewBusiness == null ) {
return null ;
}
return new OuterWebViewHandler(context, webviewBusiness);
}
}
/*****************************************************************************
* 其他工厂实现类省略 *
*****************************************************************************/
结构如下:
修改完成以后,我们来看看具体该如何使用,还是回到UI类看一下:
public class SuperFanliFragmentWebview extends BaseFragmentWebview {
}
还是在onCreate()生命周期中生成Manager实例
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState );
final WebViewHandlerProvider handlerProvider = new InnerWebViewHandlerFactory();
mProvider = handlerProvider .produce(getActivity(), this);
mProvider.onCreate(savedInstanceState );
}
这样就修改完成了,如果想要增加一种类型的Handler,只需要增加一个Factory,和一个具体的Handler即可,完全不用修改其他类,这个扩展性比较好。
当然如果不想这么干,也可以直接不用抽象工厂模式,直接简单粗暴好了:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState );
mProvider = new InnerWebViewHandler(getActivity(), this);
mProvider.onCreate(savedInstanceState);
}
最后多嘴一句,如果就这样简单粗暴,和上面抽象工厂实现相比,这两种实现方式有什么区别?
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/linux1s1s/article/details/47984183