策略者模式和工厂模式的应用
在开发中经常遇到的一种情况就是,我们在不同的业务情况,实现不同的业务,比如学生
成绩>=90 优秀
成绩>=80 <90 良好
成绩>=70 <80 中等
成绩<60 不及格
在这种情况下,我们需要用if else来判断出每种情况,给不同的评分。
if(grade>=90){
toGradeA();
}else if(grade>=80 && grade<90){
toGradeB();
}else if(grade>=60 && grade<80){
toGradeC();
}else{
toGradeD();
}
我们根据学生的成绩,执行不同的业务,如果按照上面的写法,创建不同的方法,如果新增比如0分的
再加if else判断。这样,这个类慢慢变的特别大,比较难以维护。因为上面的业务是非常简介的,实际开发中
还面临各种各样复杂的情况。再举个例子,支付宝会员制
大众会员 0
黄金会员 2000
铂金会员 6000
钻石会员 18000
再比如我们聊天发送接收消息,消息类型可以是文本,语音,图片,将来可以增加表情或者视频等等。
if(typeMessage.equals("text")){
//文本类型消息,显示文本信息
}else if(typeMessage.equals("image")){
//图片类型消息,显示图片
}else if(typeMessage.equals("sound")){
//语音类型消息,显示语音图标
}
分析:
- 在不同的业务分支中,我们需要执行不同的业务。
- 过多的if else分支语句,使类复杂,难以维护。
解决办法:
- 策略者模式
根据不同的消息,实现不同的策略规则,不同的会员类型,一定会针对不同的业务类型,需要抽取出来,最终不同的类型有不同的实现(我理解的是设计模式的核心是抽象) - 工厂模式
消息类型是固定的,因此我们需要创建消息类型,比如文本消息,语音消息----工厂模式
工厂模式用来创建对象,所有的会员对象已经在我们的工厂模式内,将来新增一条消息类型,只需要在工厂中增加一条和实现既可。
这样,就消除的if else判断(策略者模式是知道当前哪种模式,实现不同的策略,也就是如果工厂不返回当前会员类型,我们仍然需要判断,因此如果工厂返回的当前对象类型
示例:
1、新建接口,消息类型处理的抽象
public interface MsgStrategy {
void handleMsg(String type);
}
2、不同的消息类型,实现接口
语音类型消息
public class SoundMessageStrategy implements MsgStrategy {
@Override
public void handleMsg(String type) {
Log.i("Strategy","SoundMessageStrategy");
}
}
图片类型消息
public class ImageMessageStrategy implements MsgStrategy {
@Override
public void handleMsg(String type) {
Log.i("Strategy","ImageMessageStrategy");
}
}
文本类型消息
public class TextMessageStrategy implements MsgStrategy {
@Override
public void handleMsg(String type) {
Log.i("Strategy","TextMessageStrategy");
}
}
3、新建创建对象的工厂
public class StrategyFactory {
private static final String IMAGE="image";
private static final String SOUND="sound";
private static final String TEXT="text";
private static StrategyFactory factory = new StrategyFactory();
private StrategyFactory(){
}
private static Map strategyMap = new HashMap<>();
static{
strategyMap.put(IMAGE, new ImageMessageStrategy());
strategyMap.put(SOUND, new SoundMessageStrategy());
strategyMap.put(TEXT, new TextMessageStrategy());
}
public MsgStrategy creator(String type){
return (MsgStrategy) strategyMap.get(type);
}
public static StrategyFactory getInstance(){
return factory;
}
}
4、新建消息策略的控制器,根据不同的消息来处理不同的业务类型。
public class StrategyController {
private MsgStrategy msgStrategy;
public StrategyController() {
}
public void handleMsg(String type){
msgStrategy=StrategyFactory.getInstance().creator(type);
this.msgStrategy.handleMsg(type);
}
}
5、测试:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "Member#MainActivity";
private String typeMessage= "sound";
private StrategyController strategyController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
strategyController=new StrategyController();
strategyController.handleMsg(typeMessage);
}
}