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联系。
- Java23模式之策略模式(Strategy)
- java23种设计模式--策略模式(strategy)
- 【设计模式】之策略模式(Strategy)
- 设计模式之--策略模式(Strategy)
- 设计模式之策略(strategy)模式
- 设计模式之策略模式(Strategy)
- 设计模式之策略模式(Strategy)
- 设计模式之:策略模式(strategy)
- 设计模式之策略(Strategy)模式
- 设计模式之策略模式(strategy)
- 设计模式之策略模式(STRATEGY)
- Java23种设计模式之策略模式
- java23种设计模式之策略模式
- java23种设计模式之策略模式
- 策略(Strategy)模式
- Strategy(策略)模式
- 策略(Strategy)模式
- Strategy(策略模式)
- Java23模式之单例模式(Singleton)
- 关于泛型(Generic)
- xp和2003在IIS中配置url重写的差别
- 递归思想
- 获取某一年某一月有多少天
- Java23模式之策略模式(Strategy)
- java split的用法
- listview 的一些重要属性搜集
- 匿名内部类提供闭包的功能
- 图片的上传与删除(但不要考虑到空间)
- 因为迟到可以丢掉一份工作。
- 匿名内部类实现工厂方法的两个典例
- 使用Jrtplib结合opencv2.2传输一张图像的测试
- 利用Jimi进行图片缩放操作