android 源码设计模式之--策略模式

sancaiodm Android应用 2021-10-09 1010 0

1 概念定义

      策略模式: 就是把同一个功能或算法等抽象为一个接口方法。具体的实现用单独的类实现这个接口。然后我们再根据实际情况选择不同的算法或者策略(不同的实现类)来完成该功能, 通俗来讲,找出应用中可能需要变动的地方,把它们独立出来,并封装起来,不要和那些不需要变化的代码混在一起 ,使代码更加有弹性和扩展性。


2应用场景

      系统有某部分功能是经常需要增加匹配功能(用if...else..或是swtic..case)的,如果每次修改都是在上一次的代码位置中增加,如此很多此处代码非常臃肿,那么我们可以把这该部分功能抽象封装成一个接口,不同的功能用不能的类实现,要用什么功能直接用某个实现类,


3组成部分

   1 策略接口

   2 很多具体策略实现


4示例场景说明

    出行工具的不同,如码农我上班的交通工具无非就是:走路,坐公交,坐滴滴巴士,骑小毛驴(电动车),骑自行车,如按传统的方式编码都是if...else..来选择交通工具,一但我哪天多了一个上班交通方式,就得再此基础上加一个else,多100个方式就是多100个else,且每次选择有可能要执行99次选择才能选中自己需要的


5示例:传统方式

public class ChuanTongMain {
 
	private static int mZiXingChe = 1;
	private static int mGongjiao = 2;
	private static int mDidiBashi = 3;
	private static int mDiandongChe = 4;
	
	public static void main(String[] args) {
		chuXingGongGu(mZiXingChe);
	}
	
	private  static void chuXingGongGu(int fashi){
		switch(fashi){
		case 1:
			System.out.println("自行车");
			break;
		case 2:
			System.out.println("公交");
			break;
		case 3:
			System.out.println("滴滴巴士");
			break;
		case 4:
			System.out.println("电动车");
			break;
		}
	}
}

用策略模式

//定义策略接口(抽象交通工具)

public interface JiaotongGongJu {
	public void xuanzeJiaoTong();
}

 

 

//具体各种交通方式的实现

public class DiandongChe implements JiaotongGongJu {
	@Override
	public void xuanzeJiaoTong() {
		// TODO Auto-generated method stub
		System.out.println("电动车");
	}
}

public class DidiBashi implements JiaotongGongJu {
	@Override
	public void xuanzeJiaoTong() {
		// TODO Auto-generated method stub
		System.out.println("滴滴巴士");
	}
}
 
public class GongjiaoChe implements JiaotongGongJu {
	@Override
	public void xuanzeJiaoTong() {
		// TODO Auto-generated method stub
		System.out.println("公交");
	}
}
 
 
public class ZixingChe implements JiaotongGongJu {
	@Override
	public void xuanzeJiaoTong() {
		// TODO Auto-generated method stub
		System.out.println("自行车");
	}
}
 
 
public class Feiji implements JiaotongGongJu {
	@Override
	public void xuanzeJiaoTong() {
		// TODO Auto-generated method stub
		System.out.println("飞机");
	}
}

策略封装

public class Celue {
	public void xuanzejiongtong(JiaotongGongJu mJiaotongGongJu){
		if(mJiaotongGongJu != null){
			mJiaotongGongJu.xuanzeJiaoTong();
		}
	}
}

 策略选择触发

public class CelueMain {
	public static void main(String[] args) {
		Celue celue = new Celue();
		celue.xuanzejiongtong(new Feiji());
	}	
}


评论