您的位置:首页 > 其它

理解设计模式之策略模式

2017-11-14 10:39 267 查看

概述

策略模式定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。——《Head First设计模式》

几个重要的设计原则

设计原则:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

换句话说:把会变化的部分取出来并封装起来,以便后可以轻易的改动或扩充此部分,而不影响不需要变化的其他部分。这几乎是每个设计模式背后的精神所在。

设计原则:针对接口编程,而不是针对实现编程。“针对接口编程”真正的意思是“针对超类型编程”。“针对接口编程”关键就在多态,利用多态,程序可以针对超类型编程,执行时会根据实际情况执行到真正的行为,不会被绑死在超类型的行为上。“针对超类型编程”可以更明确地说成“变量的声明类型应该是超类型,通常是一个抽象类或者是一个接口,如此,只要具体实现次超类型的类所产生的对象,都可以指定给这个变量。这也意味着,声明类时不用理会以后执行时真正的对象类型!”,比如:Animal animal = new Dog(); animal.makeSound(). 这里使用Animal声明的,执行makeSound()方法的时候可以准确的执行到Dog()里面的makeSound()方法(如果存在的话)。通常在设计系统时,预先考虑到哪些地方未来可能需要变化,于是提前在代码中加入这些设计原则。系统的后期维护和扩展将会变得非常简单。

设计原则:多用组合,少用继承。

简要说明

对于同一类事,有多种不同的处理方式。同一类对象对待相同的行为,有多种不同的行为方式。这里不同的处理方式就是算法族,不同的行为方式就是算法族。针对同一接口的同一方法,可以有很多种不同的实现,我们在具体使用的时候,可以根据具体的情况,通过针对接口编程的方式(接口A a = new 实现A();在调用a.方法a()的时候就可以准确的执行到实现A里面的方法a()),可以准确的根据不同的情况调用接口不同的实现类里面的具体方法。

关系图



使用场景

不同的类实现了相同的行为接口,而这些不同的类只是在行为上不同,那么行为就是这些类的变化之处,可以使用策略模式,让同一个类在不同的情况下选择不同的行为策略。

举例说明

现在我们有一个应用需要做一个功能,就是不同的地点可以选择出合适的地图导航,因为不同的地图对不同的地点精准度不同。

现在我们假设有地图A,地图B,地图A对城市道路导航比较准确,地图B对乡村道路比较准确。现在开始编写代码:

声明接口
public Interface IUseMap{
void useMap();//使用地图
}


这个接口是所有使用地图的超类。

下面是具体实现:

public class UseAMap implements IUseMap{
@Override
public void useMap(){
//......这里是使用A地图具体的导航
}
}


public class UseBMap implements IUseMap{
@Override
public void useMap(){
//......这里是使用B地图具体的导航
}
}


下面是具体使用应用:

public class MapApp{
private IUseMap iUseMap;
public MapApp(){}
public void guide(){
iUseMap.useMap();
}
public void setIMap(IUseMap iUseMap){
this.iUseMap = iUseMap;
}
public IUseMap getIUseMap(){
return this.iUseMap;
}

}


具体使用方式:

public class Test{
public static void main(String[] args){
MapApp app = new MapApp();
app.setIUseMap(new UseAMap());
app.guide();
}
}


这样在调用地图的时候就可以利用多态调用到UseAMap类里面的useMap方法使用A地图的导航系统,就算以后添加新的地图,也不会对现有的代码产生影响。

根据设计原则:这里变化的地方就是使用地图
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式