總是被面試官問(wèn)道你在項(xiàng)目中用到了什么設(shè)計(jì)模式,之前是在自己寫的ImageLoader中對(duì)緩存用了設(shè)計(jì)模式偷崩,但是由于種種原因還是最后選擇了Picasso圖片緩存框架砖第。有的時(shí)候就不怎么好回答面試官的問(wèn)題。特記錄此篇文章進(jìn)行總結(jié)环凿。
設(shè)計(jì)原則:
- 單一職責(zé)原則:一個(gè)類應(yīng)該有且僅有一個(gè)職責(zé)
-
開閉原則: 對(duì)于一個(gè)已有的軟件,如果需要擴(kuò)展放吩,應(yīng)當(dāng)在不需修改已有代碼的基礎(chǔ)上進(jìn)行智听。
實(shí)現(xiàn)方法:抽象,把抽象接口與實(shí)現(xiàn)分離渡紫。 - 依賴倒置原則:盡量依賴于抽象到推,而不是依賴于實(shí)現(xiàn)
- 接口隔離原則: 客戶端不應(yīng)該依賴它不需要的接口;一個(gè)類對(duì)另一個(gè)類的依賴應(yīng)該建立在最小的接口上惕澎。
- 迪米特原則:最少知識(shí)原則
//將圖片保存在本地
public void put(String url, Bitmap bmp) {
OutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(cacheDir + url);
bmp.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
CloseUtils.closeQuietly(fileOutputStream);
}
}
public final class CloseUtils {
public static void closeQuietly(Closeable closeable) {
if (null != closeable) {
try {
closeable.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
1.MVP
2.策略模式的應(yīng)用
我們集成支付通常都有支付寶莉测、微信、和自己App錢包支付唧喉,到底怎么設(shè)計(jì)符合設(shè)計(jì)模式呢捣卤,請(qǐng)看?(還可以在PayHelper中設(shè)置paySuccess和payFailure的監(jiān)聽忍抽,簡(jiǎn)單起見未在示例中處理)
1. 抽象類
public abstract class Pay {
protected String sdkInfo;
protected String tradeId;
/**
* sdkInfo:調(diào)用sdk的信息
* tradeId:交易號(hào)
*/
public Pay(String sdkInfo,String tradeId){
this.sdkInfo = sdkInfo;
this.tradeId = tradeId;
}
public abstract void startPay(Activity activity);
}
2. Pay的具體實(shí)現(xiàn)
public class AliPay extends Pay {
/**
* sdkInfo:調(diào)用sdk的信息
* tradeId:交易號(hào)
*
* @param sdkInfo
* @param tradeId
*/
public AliPay(String sdkInfo, String tradeId) {
super(sdkInfo, tradeId);
}
@Override
public void startPay(final Activity activity) {
Thread payThread = new Thread(new Runnable() {
@Override
public void run() {
// 構(gòu)造PayTask 對(duì)象
PayTask alipay = new PayTask(activity);
// 調(diào)用支付接口,獲取支付結(jié)果
String result = alipay.pay(sdkInfo);
//...
}
});
payThread.start();
}
}
public class WxPay extends Pay {
/**
* sdkInfo:調(diào)用sdk的信息
* tradeId:交易號(hào)
*
* @param sdkInfo
* @param tradeId
*/
public WxPay(String sdkInfo, String tradeId) {
super(sdkInfo, tradeId);
}
@Override
public void startPay(Activity activity) {
final String[] split = sdkInfo.split("_");
PayReq req = new PayReq();
req.appId = split[0];
req.partnerId = split[1];
req.prepayId = split[2];
req.nonceStr = split[3];
req.timeStamp = split[4];
req.packageValue = split[4];
req.sign = split[6];
IWXAPI wxPayApi = WXAPIFactory.createWXAPI(activity, WxConfig.APP_ID);
wxPayApi.sendReq(req);
}
}
public class WalletPay extends Pay {
/**
* sdkInfo:調(diào)用sdk的信息
* tradeId:交易號(hào)
*
* @param sdkInfo
* @param tradeId
*/
public WalletPay(String sdkInfo, String tradeId) {
super(sdkInfo, tradeId);
}
@Override
public void startPay(Activity activity) {
//調(diào)用本地的sdk
}
}
3. Context-PayHelper
public class PayHelper {
private Pay pay;
private PayResult result;
public PayHelper(Pay pay) {
this.pay = pay;
}
public void startPay(Activity activity) {
if (!(activity instanceof PayResult)){
throw new IllegalStateException("Activity should implents PayResult");
}
result = (PayResult) activity;
pay.startPay(activity);
}
interface PayResult {
void paySuccess();
void payFailure();
}
}
4. 客戶端調(diào)用
public class Client extends Activity implements PayHelper.PayResult{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//支付寶支付
new PayHelper(new AliPay("","")).startPay(this);
//微信支付
new PayHelper(new WxPay("","")).startPay(this);
//錢包支付
new PayHelper(new WalletPay("","")).startPay(this);
}
@Override
public void paySuccess() {
}
@Override
public void payFailure() {
}
}
未完待續(xù)董朝,持續(xù)更新中鸠项!