Java23模式之策略模式(Strategy)

来源:互联网 发布:jwplayer.js下载 编辑:程序博客网 时间:2024/05/21 00:01

策略模式(Strategy Pattern)

两个基本原则:1.封装变化的概念。2.编程中使用接口类型。

定义:定义一组算法,讲每个算法封装起来,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。

 

策略模式的组成:

1.      抽象策略角色:策略类,通常由一个接口或抽象类实现。

2.      具体策略角色:包装了相关的算法和行为类。

3.      环境角色:特有一个策略类(抽象引用实现公共接口)的引用,最终给客户端调用的。

 

策略模式的编写步骤

1.      对策略对象定义一个公共接口。

2.      编写策略类,该类实现了上面的公共接口。

3.      在使用策略对象的类中保存一个策略对象的引用。

4.      在使用策略对象的类中,实现对策略对象的set和get方法,或者使用构造器完成赋值。

 

策略模式的实现:

1.      策略模式的用意是针对一组算法,将每一个算法封装到具有相同接口的独立的类中,从而使得它们可以相互替换。

2.      策略模式使得算法可以在不影响到客户端的情况下发生变化。使用策略模式可以把行为和环境分割开来。

3.      环境类负责维护和查询行为类,各种算法则在具体策略中提供。由于算法和环境独立开来,算法的修改都不会影响环境和客户端。

 

以下提供个实例:假如有若干个类Person对象存在一个List当中,对他们进行排序,分别按照名字、年龄、ID进行排序(要有正序与倒序两种排序方式)。假如年龄和名字重复,按照ID的正序进行排序。(要求只用策略模式进行)

 

一、对策略对象定义个一个接口:

packagestrategy;

importjava.util.*;

publicinterface Strategy

{

    void sort(List<Person> list);

}

 

二、编写具体策略类实现上面的公共接口(封装方法,这里只列举2个):

实现Name升序排列:

package strategy;

import java.util.*;

class UpNameSort implements Strategy , Comparator<Person>

{

         publicvoid sort(List<Person> list)

         {

                   Collections.sort(list,this);

         }

         publicint compare(Person p1 , Person p2)

         {

                   intresult = p1.getName().compareTo(p2.getName());

                   if(result==0 )

                   {//返回负,正序

                            returnp1.getId() - p2.getId();

                   }

                   returnresult;

         }

}

 

实现Name倒序排列:

package strategy;

import java.util.*;

class DownNameSort implements Strategy ,Comparator<Person>

{

         publicvoid sort(List<Person> list)

         {

                   Collections.sort(list,this);

         }

         publicint compare(Person p1, Person p2)

         {

                   intresult = p2.getName().compareTo(p1.getName());

                   if(result==0 )

                   {

                            returnp1.getId() - p2.getId();

                   }

                   returnresult;

         }

}

 

三、创建环境类(Environment)

         在环境类中定义策略类(接口引用)的引用。并通过construction或者set方法传入实例对象。通过实例对象确定当前调用的sort()方法的具体操作。通过这个策略引用来调用相应功能的方法。(这里实现方法与环境分离)

        

package strategy;

import java.util.*;

class Environment

{

         privateStrategy strategy;

         publicEnvironment(Strategy strategy)

         {

                   this.strategy= strategy;

         }

         publicEnvironment(){}

         //构造传值或者set()传值都可以。

         publicvoid setStrategy(Strategy strategy)

         {

                   this.strategy= strategy;

         }

         publicvoid sort(List<Person> list)

         {

                   this.strategy.sort(list);

         }

}

 

四、客户端类(Client)。

List<Person> list = newLinkedList<Person>();

Environment env = new Environment();

                   env.setStrategy(newUpNameSort());

                   env.sort(list);

                   for(inti = 0; i < list.size(); i++)

                   {

                            Personp = list.get(i);

                            System.out.println("Id:" + p.getId() + ", Name: " + p.getName() + ", Age: " +p.getAge());

                   }

                   env.setStrategy(newDownNameSort());

                   env.sort(list);

                   System.out.println("----------------------");

                   for(inti = 0; i < list.size(); i++)

                   {

                            Personp = list.get(i);

                            System.out.println("Id:" + p.getId() + ", Name: " + p.getName() + ", Age: " +p.getAge());

                   }

这里只是部分Code,如有需要QQ联系。