美文网首页
Java 设计模式(Design Patterns)(二)

Java 设计模式(Design Patterns)(二)

作者: 海晨忆 | 来源:发表于2018-03-09 07:51 被阅读11次

个人博客:haichenyi.com。感谢关注

六、适配器模式

分类有三种:类的适配器模式,对象的适配器模式,接口的适配器模式,我印象最深刻的是接口适配器模式

接口适配器模式

  有的时候,我们写的一个接口,会有很多种方法。而,我们的实现类只需要实现某一种,或者某几种,所以,我们这里会借助一个抽象类,去实现接口的所有方法。我们的具体实现类跟这个抽象类去打交道,而不是跟原始的接口去打交道。

/**
 * Author: 海晨忆.
 * Date: 2017/12/21
 * Desc:
 */
public abstract class MySubscriber<T> extends ResourceSubscriber<T> {
  private BaseView baseView;
  private boolean showLoading;

  public MySubscriber(BaseView baseView) {
    this.baseView = baseView;
  }

  public MySubscriber(BaseView baseView, boolean showLoading) {
    this.baseView = baseView;
    this.showLoading = showLoading;
  }

  @Override
  protected void onStart() {
    super.onStart();
    if (null != baseView && showLoading) {
      baseView.showLoading();
    }
  }

  @Override
  public void onError(Throwable t) {
    if (null == baseView) {
      return;
    }
    baseView.hideLoading();
    if (t instanceof ApiException) {
      ApiException apiException = (ApiException) t;
      switch (apiException.getCode()) {
        case HttpCode.NO_PARAMETER:
          baseView.showTipMsg("参数为空");
          break;
        case HttpCode.SERVER_ERR:
          baseView.showTipMsg("服务器错误");
          break;
        default:
          break;
      }
    }
  }

  @Override
  public void onComplete() {
    if (null != baseView) {
      baseView.hideLoading();
    }
  }
}


addSubscribe(helper.selectBrandList()
        .compose(RxUtil.handleHttp())
        .subscribeWith(new MySubscriber<List<String>>(baseView, true) {
          @Override
          public void onNext(List<String> dataList) {
            Log.v("wz","111")
          }
        }));

  上面这个代码,就是我之前写的从零开始搭建一个主流项目框架系列里面的网络请求,处理返回结果的回调方法,我的返回结果,不可能每个去实现onStart,onError,onNext,onCompleted方法。我的实现类只用去继承这个类,实现某一个,或者某几个方法。更直接的就是,我之前写的框架,BaseActivity,实现BaseView接口,然后,我其他的Activity去继承BaseActivity,选择实现BaseView的方法。

如果上面这样,你还无法认同,那我们看看下面这个:

//success动画结束监听
    successAnim.addListener(new AnimatorListenerAdapter() {
      @Override
      public void onAnimationEnd(Animator animation) {
        super.onAnimationEnd(animation);
        if (null != myAnimotionInterface) {
          myAnimotionInterface.AnimationEnd();
        }
      }
    });
    

动画监听,我这里只想监听动画结束,在动画结束的时候,我做我的逻辑处理,但是,他的接口有开始,结束,暂停,重复等等监听,我不要这么,你们可以点 AnimatorListenerAdapter() 这个类,去看一下他是什么,他就是一个抽象类,实现了动画监听的那个接口,这个是官方封装好的一个类。

七、装饰器模式

这个模式就是我之前写从零开始搭建一个主流项目框架系列里面网络请求,SP的操作,Socket的操作,关于他们的封装都是用的装饰者模式。说的官方一点:装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。项目中的应用就是:

/**
 * Author: 海晨忆.
 * Date: 2017/12/21
 * Desc:
 */
public interface HttpHelper {
  Flowable<WeatherBean> getWeather(String city);

  /**
   * 登录时获取验证码.
   *
   * @param phone 手机号
   * @return {"code":0}
   */
  Flowable<HttpNoResult> loginCode(String phone);
  }

  这个就是装饰对象和被装饰对象实现的同一个接口,他们一开始就只有一个功能,那就是获取天气,后来他们又新加了一个功能,必须登录之后才能获取天气,那就多了一个登录功能

/**
 * Author: 海晨忆.
 * Date: 2017/12/21
 * Desc:
 */
public class DataHelper implements HttpHelper, PreferencesHelper, SqlHelper {
  private SqlHelper sqlHelper;
  private HttpHelper httpHelper;
  private PreferencesHelper preferencesHelper;

  /**
   * 初始化数据帮助类.
   *
   * @param sqlHelper         {@link SqlHelper}
   * @param httpHelper        {@link HttpHelper}
   * @param preferencesHelper {@link PreferencesHelper}
   */
  public DataHelper(SqlHelper sqlHelper, HttpHelper httpHelper,
                    PreferencesHelper preferencesHelper) {
    this.sqlHelper = sqlHelper;
    this.httpHelper = httpHelper;
    this.preferencesHelper = preferencesHelper;
  }

  @Override
  public Flowable<WeatherBean> getWeather(String city) {
    return httpHelper.getWeather(city);
  }

  @Override
  public Flowable<HttpNoResult> loginCode(String phone) {
    return httpHelper.loginCode(phone);
  }
} 

  这个就是装饰类,负责调用接口的方法

/**
 * Author: 海晨忆.
 * Date: 2017/12/21
 * Desc:
 */
public class RetrofitHttp implements HttpHelper {
  private WardrobeApi wardrobeApi;
  private WeatherApi weatherApi;

  @Inject
  RetrofitHttp(WardrobeApi wardrobeApi, WeatherApi weatherApi) {
    this.wardrobeApi = wardrobeApi;
    this.weatherApi = weatherApi;
  }

  @Override
  public Flowable<WeatherBean> getWeather(String city) {
    return weatherApi.getWeather(city, "c41d9ca568d449e2802244d8eeb3d3c6");
  }

  @Override
  public Flowable<HttpNoResult> loginCode(String phone) {
    return wardrobeApi.loginCode(phone);
  }
}  

  这个就是被装饰类,负责具体的实现,这里是retrofit网络请求。以上都是伪代码。具体就是为了说明这个装饰者模式的中心思想,以及我在项目中的运用,不保证一定完全正确,都是按照自己的理解写的。

PS:其他的设计模式等用到了再补充

相关文章

网友评论

      本文标题:Java 设计模式(Design Patterns)(二)

      本文链接:https://www.haomeiwen.com/subject/xxsjfftx.html