理解设计模式之策略模式
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地图的导航系统,就算以后添加新的地图,也不会对现有的代码产生影响。
根据设计原则:这里变化的地方就是使用地图
相关文章推荐
- 设计模式之策略模式理解
- 深入理解JavaScript系列(33):设计模式之策略模式详解
- 设计模式: 真正理解策略模式(Strategy)
- 深入理解JavaScript系列(33):设计模式之策略模式
- 【设计模式】策略模式的理解
- 深入理解JavaScript系列(33):设计模式之策略模式
- 深入理解JavaScript系列(33):设计模式之策略模式详解
- 三分钟理解“策略模式”——设计模式轻松掌握
- 三分钟理解“策略模式”——设计模式轻松掌握
- 深入理解JavaScript系列(33):设计模式之策略模式
- 设计模式之策略模式理解
- 深入理解JavaScript系列(33):设计模式之策略模式
- 我所理解的设计模式(C++实现)——策略模式(Strategy Pattern)
- 深入理解JavaScript系列(33):设计模式之策略模式
- 深入理解JavaScript系列(33):设计模式之策略模式
- 深入理解JavaScript系列(33):设计模式之策略模式
- 我所理解的设计模式(C++实现)——策略模式(Strategy Pattern)
- 笑着理解设计模式-java--策略模式
- 实习之路0--设计模式之策略模式的理解(鸭子类例子)
- 深入理解JavaScript系列(33):设计模式之策略模式