浅谈代码设计思想

2018/04/05

检查组内成员代码的时候发现了不少天马行空的代码,其中有这么一段

if (payType == 1) {
    new WXPay(parma, context).pay();
}
if (payType == 2) {
    new AliPay(parma, context).pay();
}

顿时觉得有必要提醒他去理解设计模式。

我觉得List的设计模式很好,声明List接口,有多种实现。实际在使用中只要我们用List声明,无需看后面的具体实现也可以知道这是一个链表, 像这样

List<Model> list = ...

这个List可以是ArrayList,也可以是LinkedList,还可以是其他实现类。但我们调用的接口的方法,多数情况下无需关心具体的实现,有了List的链表声明,也许今天你是这样:

List<Model> list = new ArrayList<>();
...
list.add(model);

明天想改成这样:

List<Model> list = new LinkedList<>();
...
list.add(model);

也是完全没问题的,虽然实现不同,但始终都还是一个List接口。

在做我们App支付方法设计的时候我吸收的就是类似的思想,只不过要归类模式的话List是策略模式,而我设计的Pay是模板方法模式。具体的设计

public abstract class AbstractPay {
    protected Activity activity;
    protected String payParams;
    
    public AbstractPay(String payParams, Activity activity) {
        this.payParams = payParams;
        this.activity = activity;
    }
    
    public abstract void pay();
}

需要的参数activity和payParams我保存在AbstractPay里面,提供实现子类直接调用,实际的支付不管是哪一个实现都只需调用AbstractPay声明的pay()方法。

回到引起问题讨论的源头代码:

if (payType == 1) {
    new WXPay(parma, context).pay();
}
if (payType == 2) {
    new AliPay(parma, context).pay();
}

这里有两种支付实现。而我设计的初衷是希望调用的的时候这么写:

AbstractPay pay;
if (payType == 1) {
    pay = new WXPay(parma, context);
}
if (payType == 2) {
    pay = new AliPay(parma, context);
}
pay.pay();

思维结构:做什么 —-> 怎么做—->执行

  • 做什么:支付
AbstractPay pay;
  • 怎么做:1.微信 2.支付宝 …
if (payType == 1) {
    pay = new WXPay(parma, context);
}
if (payType == 2) {
    pay = new AliPay(parma, context);
}
...
  • 执行:支付行为
pay.pay();

后续如果再多几种支付也只需要在“怎么做”这个环节多几个赋值而已,就专职告诉AbstractPay是哪种实现,其他地方不用动,这就是我的设计初衷。

设计模式在解耦、实现指引、思路清晰、模块分类等方面都各有好处,但如果不被理解那设计出来有什么意义。

Post Directory