设计模式三 strategy策略模式

策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。

1、需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,

2、2.1 设计另一个接口,专门封装算法;

     2.2 设计一个抽象类(可有可无,属于辅助类),提供辅助函数。参考:http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html


一:代码举例:

1、实现一个接口可以比较即可;

package stragy.compare;

public interface Comparable<T> {
	
	boolean compareTo(T obj);
	
}
2、定义一个cat类,继承该接口,即此【Cat类】通过年龄old比较大小;

package stragy.compare;

public class Cat implements Comparable<Cat>{

	private String name;
	private int old;
	private int weight;
 

	public Cat(String name,int old){
		super();
		this.name = name;
		this.old = old;
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getOld() {
		return old;
	}

	public void setOld(int old) {
		this.old = old;
	}
 
	public int getWeight() {
		return weight;
	}

	public void setWeight(int weight) {
		this.weight = weight;
	}

	@Override
	public boolean compareTo(Cat cat) {
		if(this.old > cat.getOld()){
			return true;
		}
		return false;	
	}

}


3、测试代码

package stragy.compare;

public class TestMain {

	public static void main(String arg[]){
		Cat cat1 = new Cat("Cat01",1);
		cat1.setWeight(222);
		Cat cat2 = new Cat("Cat02",2);
		cat1.setWeight(200);
		boolean b=cat1.compareTo(cat2);
		System.out.println(b);
		
		
		
	}
	
}


4、将【Cat类】中的比较方法单独抽离出来;

4.1 定义一个【Comparator】接口,如下:

package stragy.compare;

public interface Comparator<T> {
	boolean comparator(T obj1,T obj2);
}

4.2 定一个【CatComparator类】实现如下,此实现按照  猫的体重来比较;

package stragy.compare;

public class CatComparator implements Comparator<Cat>{

	@Override
	public boolean comparator(Cat obj1, Cat obj2) {
		if(obj1.getWeight()>obj2.getWeight()){
			return true;
		}
		return false;
	}
	 
}

4.3 那么Cat类改为如下:

package stragy.compare;

public class Cat implements Comparable<Cat>{

	private String name;
	private int old;
	private int weight;
	private CatComparator comparator;

	public Cat(String name,int old){
		super();
		this.name = name;
		this.old = old;
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getOld() {
		return old;
	}

	public void setOld(int old) {
		this.old = old;
	}
 
	public int getWeight() {
		return weight;
	}

	public void setWeight(int weight) {
		this.weight = weight;
	}

	@Override
	public boolean compareTo(Cat cat) {
//		if(this.old > cat.getOld()){
//			return true;
//		}
//		return false;
		comparator = new CatComparator();
		return comparator.comparator(this, cat);
		
	}
	
	
	

}

4.4 测试不变。



















基于python实现的粒子群的VRP(车辆配送路径规划)问题建模求解+源码+项目文档+算法解析,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。 算法设计的关键在于如何向表现较好的个体学习,标准粒子群算法引入惯性因子w、自我认知因子c1、社会认知因子c2分别作为自身、当代最优解和历史最优解的权重,指导粒子速度和位置的更新,这在求解函数极值问题时比较容易实现,而在VRP问题上,速度位置的更新则难以直接采用加权的方式进行,一个常见的方法是采用基于遗传算法交叉算子的混合型粒子群算法进行求解,这里采用顺序交叉算子,对惯性因子w、自我认知因子c1、社会认知因子c2则以w/(w+c1+c2),c1/(w+c1+c2),c2/(w+c1+c2)的概率接受粒子本身、当前最优解、全局最优解交叉的父代之一(即按概率选择其中一个作为父代,不加权)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值