设计模式简介
设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理地运用设计模式可以完美地解决很多问题,每种模式在现实中都有相应的原理来与之对应,每种模式都描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是设计模式能被广泛应用的原因。
策略模式
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。
在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
优点:
- 算法可以自由切换。
- 避免使用多重条件判断。
- 扩展性良好。
缺点:
- 策略类会增多。
- 所有策略类都需要对外暴露。
使用场景:
- 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
- 一个系统需要动态地在几种算法中选择一种。
- 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
注意事项: 如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
实现
public interface Num {
public int operation(int a,int b);
}
public class add implements Num{
@Override
public int operation(int a, int b) {
return a+b;
}
}
public class Sub implements Num{
@Override
public int operation(int a, int b) {
return a-b;
}
}
public class Multiply implements Num{
@Override
public int operation(int a, int b) {
return a*b;
}
}
public class Divide implements Num{
@Override
public int operation(int a, int b) {
return a/b;
}
}
执行策略的类
public class Strategy {
public Num num;
public Strategy setNum(Num num) {
this.num = num;
return this;
}
public int getRes(int a,int b) {
return num.operation(a, b);
}
}
public static void main(String[] args) {
int a = 10,b = 5;
Strategy strategy = new Strategy();
System.out.println(strategy.setNum(new add()).getRes(a, b));
System.out.println(strategy.setNum(new Sub()).getRes(a, b));
System.out.println(strategy.setNum(new Multiply()).getRes(a, b));
System.out.println(strategy.setNum(new Divide()).getRes(a, b));
}
结果
15
5
50
2