检查组内成员代码的时候发现了不少天马行空的代码,其中有这么一段
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是哪种实现,其他地方不用动,这就是我的设计初衷。
设计模式在解耦、实现指引、思路清晰、模块分类等方面都各有好处,但如果不被理解那设计出来有什么意义。