`
bingooh
  • 浏览: 53268 次
  • 性别: Icon_minigender_1
  • 来自: 佛山
社区版块
存档分类
最新评论

4.21 使用函数式对象实现策略模式

 
阅读更多

在JavaScript里,可以直接传递函数引用(被传递的函数可视为类型为Function的对象),如下:

function sayHello(){
  alert("hello, world!");
}

<input type="button" onclick="sayHello()"/

 

在Java里,目前应该还不可以这样传递。但是可以使用函数式对象实现类似功能。函数式对象指仅包含一个方法的对象,并且此方法应满足以下条件:

1.在任何情况下,使用相同的输入参数值应返回同一个结果

2.在任何情况下,执行此方法不会修改对象的状态

 

以下方法不能视为函数方法:

class DiscountOne {
	public double percent=1.0d;
	
	//如果percent改变,对于相同的price,将返回不同的计算结果
	public double discount(double price){
		return price*percent;
	}
}

class DiscountTwo {
	public int count=100;
	
	//调用此方法将修改count属性值,即改变了对象状态,
	//而计算结果与对象状态有关
	public double discount(double price){
		if(count<=0)return price;
		
		count--;
		return price*0.5d;
	}
}

 

实现策略设计模式首先需要有定义策略的接口,如下:

public interface Discount {
	double discount(double price);
}

 

接着声明函数式策略类

public class DiscountByPercent implements Discount{
	private double percent;
	
	public DiscountByPercent(double percent){
		this.percent=percent;
	}
	
	public double discount(double price) {
		return price*percent;
	}
}

 

可以使用常量声明常用的函数式对象,以避免重复创建对象:

public static final Discount HALF_PRICE_DISCOUNT=new DiscountByPercent(0.5d);
	

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics