"围观"设计模式(20)--行为型之策略模式(Strategy Pattern)

策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。----WIKIPEDIA


个人理解

策略模式从名字就可以看出,有多种选择,不同的策略对应着不同的实现方式,那么一般的形式为一个接口采用多种实现方式(也就是提供了不同的策略),然后再提供一个策略的选择类即可,定义中:定义一组算法,将每个算法都封装起来,并且使得他们之间可以相互的转换。通过上面我提到的这种方式来看,一组算法就是指的多种的实现方式,而将每个算法都封装起来并使得他们之间可以互换,实现了统一的接口,自然可以实现互换了。


案例解析

举个比较常见的例子,红绿灯,当你过马路的时候,会看一下红绿灯,从小就学会了:绿灯行、红灯停、黄灯亮了等一等。这样的话,相当于三个策略,根据这个实例来设计类的结构。


其中,TrafficLight接口提供了统一的接口,其他的几个类实现该接口并实现其中的方法,那么这样的设计就可以保证其可以进行替换,然后Context类则提供了策略的选择类,与其说是选择不如说是提供了外界访问的入口,只需要根据不同的策略创建好context的实例然后直接调用其方法就可以了,这里的名称并不一定要和接口中相同。


接口代码:

public interface TrafficLight {

	/**
	 * 输出该灯对应的注意事项
	 */
	public void checkLight();
}

策略的选取类

public class Context {

	private TrafficLight light;

	public Context() {
		super();
	}

	public Context(TrafficLight light) {
		super();
		this.light = light;
	}
	
	public void checkLight(){
		this.light.checkLight();
	}
}
接口的实现 (只列出一个)

public class RedLight implements TrafficLight {

	@Override
	public void checkLight() {
		System.out.println("停");
	}
	
}

测试类

public static void main(String[] args) {
		Context context = null;
		context = new Context(new RedLight());
		context.checkLight();
		
		context = new Context(new YellowLight());
		context.checkLight();
		
		context = new Context(new GreenLight());
		context.checkLight();
	}


策略模式拓展

一般策略模式

加减运算,按照上面的架构方式,完全可以实现,基本的形式为,同样提供一个接口和Context供选择策略的类即可。这里只列出其类图,代码可以根据下面的链接进行下载设计模式源代码下载


策略枚举

通过枚举实现策略模式的一个示例,主要的代码如下

public enum Calculator {

	ADD("+"){

		@Override
		public int cal(int a, int b) {
			
			return a + b;
		}
		
	},
	SUB("-"){

		@Override
		public int cal(int a, int b) {
			
			return a - b;
		}
		
	};
	
	
	String value = "";
	
	private Calculator(String value) {
		this.value = value;
	}
	
	public abstract int cal(int a, int b);
}
public class Context {

	public void cal(int a,String operator, int b){
		if("+".equals(operator)){
			System.out.println(Calculator.ADD.cal(a, b));
		}else if("-".equals(operator)){
			System.out.println(Calculator.SUB.cal(a, b));
		}
	}
}

测试类

public static void main(String[] args) {
		Context context = new Context();
		
		context.cal(1, "+", 2);
		
		context.cal(1, "-", 2);
		
	}

1. 他本身是枚举。

2. 他可以实现策略模式。


策略模式的优点

1. 具体实现可以自由的切换。

2. 避免了多重的判断。

3. 扩展性比较好,如果再多的策略的时候,可以继续实现统一的接口,实现其方法即可。


策略模式的缺点

1. 策略类的数量增多。

2. 所有的策略类都需要对外暴露,上层模块必须知道有哪些策略然后才能知道应该使用哪个策略,这与迪米特法则相违背,不过可以通过其他的模式来弥补其缺陷,比如:工厂方法模式、代理模式、享元模式。


策略模式适用场景

1. 多个类只在具体的实现上有所不同。

2. 具体的实现方法可以进行自由的切换。


设计模式源代码下载

设计模式源代码下载


设计模式系列文章推荐阅读

"围观"设计模式(18)--行为型之模板方法模式(TemplateMethod Pattern)

"围观"设计模式(19)--行为型之观察者模式(Observer Pattern)

"围观"设计模式(16)--结构型之组合模式(Composite Pattern)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值