java设计模式(二十一)--策略模式

对于策略模式,我在很多面试题上看到过考察这一类的问题,这种模式也的确比较好用。 我感觉这种模式就是将不同实现的方法放到一个接口中,然后通过实现这个接口来实现不同的运行结果,这种模式有三部分构成: 策略接口 策略实现类 策略作用类(使用策略的类) 网络上的专业解释:

此模式下,一个类的行为或者其算法可以在运行时更改,我们要定义一系列的算法,把他们一个个封装起来,并使他们可以相互替换。

实例:用此模式描述四则运算,可不断替换。

以下是我对此实例做的类图:

输入图片说明

以下是我编写代码: 1.创建策略接口,用来存放四则运算计算器中的不同运行的方法

//策略接口
interface Strategy {
	int doAction(int num1,int num2);
}

2.创建实现策略接口的四则计算实现类

public class AddStrategy implements Strategy {
	@Override
	public int doAction(int num1, int num2) {
		return num1+num2;
	}
}

public class SubtractStrategy implements Strategy{
	@Override
	public int doAction(int num1, int num2) {
		return num1-num2;
	}
}

public class MultiplyStrategy implements Strategy {
	@Override
	public int doAction(int num1, int num2) {
		return num1*num2;
	}
}

public class DivisionStrategy implements Strategy {
	@Override
	public int doAction(int num1, int num2) {
		return num1/num2;
	}
}

3.创建一个使用某种策略的类,可以根据需求不同来使用不同的策略

public class Calculator {
	private int num1;
	private int num2;
	public Calculator(int num1, int num2) {
		this.num1 = num1;
		this.num2 = num2;
	}
	public int operate(Strategy strategy){
		return strategy.doAction(num1, num2);
	}
}

4.创建测试类,使用不同的策略来实现需求

public class Test {
	public static void main(String[] args) {
		System.out.println("=========加法计算器==========");
		Calculator calculator=new Calculator(1, 2);
		System.out.println("1+2="+calculator.operate(new AddStrategy()));
		System.out.println("=========减法计算器==========");
		Calculator calculator1=new Calculator(10, 20);
		System.out.println("10-20="+calculator1.operate(new SubtractStrategy()));
		System.out.println("=========乘法计算器==========");
		Calculator calculator2=new Calculator(3, 5);
		System.out.println("3*5="+calculator2.operate(new MultiplyStrategy()));
		System.out.println("=========除法计算器==========");
		Calculator calculator3=new Calculator(10, 2);
		System.out.println("10/2="+calculator3.operate(new DivisionStrategy()));
	}
}

5.后台输出

=========加法计算器==========

1+2=3
=========减法计算器==========

10-20=-10
=========乘法计算器==========

3*5=15
=========除法计算器==========

10/2=5

看完代码之后,大家是不是感觉这种模式与状态模式是差不多的,是差不多,他俩原理都是用的覆盖嘛,但是状态模式的状态作用者里面要用到状态的实例对象,但是这个策略模式的策略使用者却是将策略当做参数来传入的,这样减少了对象的创建,提高了性能。

这种模式的优点:

    1.如果我们要加一个相反数策略的话,只需要实现策略接口即可,体现了易扩展性,符合”开闭原则”。
    2.算法在客户端可以根据需要自由切换,适应了不同需求。
    3.在客户端使用将策略对象参数化的方法来调用具体策略的方法,避免在客户端新建对象实例,提高系统性能。

缺点:

    1.策略使用类要知道所有的策略类才行,然后才能自行决定要用哪一个策略。
    2.随着策略的不断增多,策略类也会不断的增多,提高后期的维护困难性。

转载于:https://my.oschina.net/u/3631883/blog/1523138

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值