1. 什么是策略设计模式
- 比如定义一系列算法,把每个算法封装起来,使他们可以互相交替,独立他的客户而变化,这就是策略设计模式
2.为什么要使用策略设计模式
- 实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择。
- 这两种实现方法我们都可以称之为硬编码,如果需要增加一种新的查找算法,需要修改封装算法类的源代码;更换查找算法,也需要修改客户端调用代码。在这个算法类中封装了大量查找算法,该类代码将较复杂,维护较为困难。如果我们将这些策略包含在客户端,这种做法更不可取,将导致客户端程序庞大而且难以维护,如果存在大量可供选择的算法时问题将变得更加严重。
3.使用策略设计模式的目的
- 为了使算法和对象分离出来,使算法可以独立于使用的它的的对象改变而改变
4.怎样使用策略算法
- 把类中经常改变的或者未来将改变的部分提取出来,作为一个接口,然后在这个类中包含这个对象的实列,这样实列就可以随意掉这个接口的行为
5.应用场景要素
- 具体策略类
- 环境类
- 调用者
抽象策略类
具体代码 抽象策略类: package com.edu.cdu.ms; //就是一个接口这里有要实现的方法 public interface Voice { public abstract void shut(); } 具体策略类: 1. package com.edu.cdu.ms; public class Voicebad implements Voice { @Override public void shut() { // TODO Auto-generated method stub System.out.println("声音难听"); } } 2. package com.edu.cdu.ms; public class VoiceNice implements Voice { @Override public void shut() { // TODO Auto-generated method stub System.out.println("声音好听"); } } 3. package com.edu.cdu.ms; public class VoiceNone implements Voice { @Override public void shut() { // TODO Auto-generated method stub System.out.println("声音没有声音"); } } 环境类:package com.edu.cdu.ms; public abstract class Animal { private Voice vioce; private String name; private String color; public Animal(Voice vioce, String name, String color) { super(); this.vioce = vioce; this.name = name; this.color = color; } public void shut() { vioce.shut(); } } package com.edu.cdu.ms; public class Dog extends Animal{ public Dog(Voice vioce, String name, String color) { super(vioce, name, color); // TODO Auto-generated constructor stub } } 3.调用者 package com.edu.cdu.ms; import org.junit.Test; public class TestMs { @Test public void test() throws Exception { Dog dog=new Dog(new Voicebad(), "小黄", "黑色"); dog.shut(); } }