导读
可以这么说,所有的设计模式都是对于编程中的某一类问题的解决方案。在大多数人眼里或许设计模式非常的难,但其实它只是一种有着固定边界、确定的方案而已,当经过多次的使用,慢慢的熟练了你就不会觉得它有这么难了,到那时你会觉得它真的简单、真的强大。
是什么
策略模式是一种编程的思想,某类问题的解决方案,它可以解决我们在编程中遇到的一些特定的问题,策略即在处理一件事情的时候,不同的情况会有不同的处理方法,不同的处理方法就是不同的策略,常见的一个例子就是我们日常生活中的出行方式的选择,汽车、公交车、地铁,同样是选出行方式,不同的情形下就会有不同的选择方式。
为什么
明白了是什么,那么我们就需要知道它为什么会出现,在我们的编程中,通常都会有这样的情景,某件事的完成(某个功能的完成)在不同的条件下会有不同的处理过程,在编程中常见的就是if else…等的判断,但这种多if的判断会使得代码变的非常的难维护和功能的拓展,正是为了解决这种多条件下的不同处理方法才出现了策略模式,我们可以将处理方法放在一个抽象的接口中,具体的实现方式由子类来确定,每一个不同的处理都在它的子类中实现,具体的执行方法在执行中动态确定(传入哪个子类就执行哪个子类的方法),这样就可以避免多if判断,对于程序功能的拓展,代码的维护也就相对的容易了许多。
UML类图
Context
中文描述为上下文,其实只是一个名字而已,不用过多的对概念进行死磕,可以这么理解,在出行方式选择的例子中,它就是我们,就是一个人,它里面维护着策略对象,选择出行方式是它的一个方法,方法里的具体实现即通过维护的策略对象调用具体的策略方法。再比如我们去商场中结账台的结账,有时候打三折、有时候会有满减,这时候的Context就可以理解为结账台这个东东,它维护着一个结账方式的策略对象,它的结账功能就是通过调结账方式维护的策略对象的具体策略方法来实现。
Strategy
抽象的策略对象,它是一个接口,声明了一个具体的策略方法。
ConcreteStategy
具体的策略对象,是对抽象策略方法的具体实现类。
一个代码示例
// 上下文对象
public class TrafficContext {
private TrafficSuper trafficSuper;
public TrafficSuper(TrafficSuper trafficSuper) {
this.trafficSuper= trafficSuper;
}
public String getResult(int i) {
return trafficSuper.getTraffic(i);
}
}
//策略接口
public interface TrafficSuper{
public String getTraffic(int i);
}
//具体的策略实现类
public class Car implement TrafficSuper{
@Override
public String getTraffic(int i) {
return "car";
}
}
public class BiCycle implements TrafficSuper{
@Override
public String getTraffic(int i) {
return "bicycle";
}
}
//客户端
public class Client {
public static void main(String[] args) {
TrafficContext trafficContext = null;
Scanner scanner = new Scanner(System.in);
System.out.print("请输入出行方式(1/2):");
int in = scanner.nextInt();
String type = "";
switch (in) {
case 1:
trafficContext = new TrafficContext (new Car());
type += "汽车";
break;
case 2:
trafficContext = new TrafficContext (new BiCycle());
type += "自行车";
break;
default:
System.out.println("请输入1/2");
break;
}
System.out.println("出行方式:" + type);
scanner.close();
}
}
小注意点
- 策略模式会使类变多,每一种策略都是一个类。
- 具体的使用应该要看具体的项目场景,不是说每个项目在设计时都要尽可能的使用各种设计模式。