Android 进阶- 设计模式 -策略模式
2019-06-14 本文已影响0人
伊泽瑞额
定义
策略模式定义了一系列算法,并将每一个算法封装起来,而且使它们可以相互替换。策略模式让算法独立于使用它的客户端而独立变化(实际上就是面向接口编程)
使用场景
如果一个功能得实现,可以由多种不同得形式或者算法来实现,就可以使用策略模式来动态地让一个对象在许形式或者算法中选择一种。
策略模式得实现
例子1: 网络引擎得切换:https://www.jianshu.com/p/f7a72d85bd3d
例子2: 以文件、图片命名策略为例:
1. 定义一个策略接口:
package com.example.amn.testdemo;
/**
* 策略接口
*/
public interface IFileNameGenerator {
String generate(String imageUri);
}
2. hashcode得方式去命名得实现类 :
package com.example.amn.testdemo;
/**
* 以hashcode得形式命名
*/
public class HashCodeFileNameGenerator implements IFileNameGenerator {
@Override
public String generate(String imageUri) {
return String.valueOf(imageUri.hashCode());
}
}
3. MD5得方式去命名得实现类 :
package com.example.amn.testdemo;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* md5
*/
public class Md5FileNameGenerator implements IFileNameGenerator {
private static final String HASH_ALGORITHM = "MD5";
private static final int RADIX = 10 + 26; // 10 digits + 26 letters
@Override
public String generate(String imageUri) {
byte[] md5 = getMD5(imageUri.getBytes());
BigInteger bi = new BigInteger(md5).abs();
return bi.toString(RADIX);
}
private byte[] getMD5(byte[] data) {
byte[] hash = null;
try {
MessageDigest digest = MessageDigest.getInstance(HASH_ALGORITHM);
digest.update(data);
hash = digest.digest();
} catch (NoSuchAlgorithmException e) {
}
return hash;
}
}
4. 创建一个管理类管理策略变量调用具体策略所实现的策略接口中的方法 :
package com.example.amn.testdemo;
/**
* 该方法委托策略变量调用具体策略所实现的策略接口中的方法。
*/
public class FileNameManager {
private IFileNameGenerator mFileNameGenerator;
public FileNameManager(IFileNameGenerator fileNameGenerator ){
this.mFileNameGenerator=fileNameGenerator;
}
public String fileNameGenerator(String imgUrl){
return mFileNameGenerator.generate(imgUrl);
}
}
5. 使用 :
String url="";
//使用hashcode
FileNameManager fileNameManager = new FileNameManager(new HashCodeFileNameGenerator());
fileNameManager.fileNameGenerator(url);
//使用nd5
FileNameManager fileNameManager1=new FileNameManager(new Md5FileNameGenerator());
fileNameManager1.fileNameGenerator(url);