策略者模式和工厂模式的应用

策略者模式和工厂模式的应用

在开发中经常遇到的一种情况就是,我们在不同的业务情况,实现不同的业务,比如学生
成绩>=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")){
            //语音类型消息,显示语音图标
    }

分析:

  1. 在不同的业务分支中,我们需要执行不同的业务。
  2. 过多的if else分支语句,使类复杂,难以维护。

解决办法:

  1. 策略者模式
    根据不同的消息,实现不同的策略规则,不同的会员类型,一定会针对不同的业务类型,需要抽取出来,最终不同的类型有不同的实现(我理解的是设计模式的核心是抽象)
  2. 工厂模式
    消息类型是固定的,因此我们需要创建消息类型,比如文本消息,语音消息----工厂模式
    工厂模式用来创建对象,所有的会员对象已经在我们的工厂模式内,将来新增一条消息类型,只需要在工厂中增加一条和实现既可。
    这样,就消除的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);
    }
}