设计模式-策略模式(Strategy Model)
1、概述
2、目的
3、适用场景
4、结构与组成
4、实现
package com.cnblogs.vicentzh.strategymodel;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
public class StrategyModel
{
/**
* @Describe 客户端程序
* @param args
*/
public static void main(String[] args)
{
Student p1 = new Student("Tom",1,20);
Student p2 = new Student("Tonny",2,50);
Student p3 = new Student("Tom",5,30);
Student p4 = new Student("John",8,10);
Student p5 = new Student("Susan",9,15);
List<Student> students = new ArrayList<Student>();
students.add(p1);
students.add(p2);
students.add(p3);
students.add(p4);
students.add(p5);
Context env = new Context();
//正序排列
UpNameSort uns = new UpNameSort();
env.setSortStrategy(uns);
env.sort(students);
for (Iterator<Student> iter=students.iterator(); iter.hasNext();)
{
Student student = iter.next();
System.out.println("id: " + student.getId() + ", name: " + student.getName()
+ ", age:" + student.getAge());
}
System.out.println("-----------------------");
//倒序排列
DownNameSort dns = new DownNameSort();
env.setSortStrategy(dns);
env.sort(students);
for (Iterator<Student> iter=students.iterator(); iter.hasNext();)
{
Student student = iter.next();
System.out.println("id: " + student.getId() + ", name: " + student.getName()
+ ", age:" + student.getAge());
}
}
}
//需要用到的具体实例类
class Student
{
private String name;
private int age;
private int id;
public Student(String name, int age, int id)
{
this.name = name;
this.age = age;
this.id = id;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public int getId()
{
return id;
}
}
//抽象策略类(Strategy),即策略接口
interface SortStrategy
{
public void sortStudent(List<Student> students);
}
//具体策略类(ConcreteStrategy),即具体正序算法实现类
class UpNameSort implements SortStrategy,Comparator<Student>
{
@Override
public void sortStudent(List<Student> students)
{
Collections.sort(students, this);
}
@Override
public int compare(Student o1, Student o2)
{
int result = o1.getName().compareTo(o2.getName());
if(0==result)
{
return o1.getId() - o2.getId();
}
return result;
}
}
//具体策略类(ConcreteStrategy),即具体倒序算法实现类
class DownNameSort implements SortStrategy, Comparator<Student>
{
@Override
public void sortStudent(List<Student> students)
{
Collections.sort(students, this);
}
@Override
public int compare(Student o1, Student o2)
{
int result = o2.getName().compareTo(o1.getName());
if(0==result)
{
return o1.getId() - o2.getId();
}
return result;
}
}
//使用环境类(Context)
//环境类根据接收到客户端具体的策略来对对象进行使用,同样也能用setSortStrategy方法
//随时根据客户端的需求去改变策略算法,并且不影响对象。
class Context
{
private SortStrategy concreteStrategy; //使用策略配置环境类
public Context(SortStrategy conSortStrategy)
{
this.concreteStrategy = conSortStrategy;
}
public Context()
{
}
//可随意定制化具体策略
public void setSortStrategy(SortStrategy conSortStrategy)
{
this.concreteStrategy = conSortStrategy;
}
//使用具体的策略(concreteStrategy)对对象进行操作
public void sort(List<Student> students)
{
concreteStrategy.sortStudent(students);
}
}
5、优缺点
6、总结分析
作者:vincentzh
出处:http://www.cnblogs.com/vincentzh/
本文以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,非商业用途!
设计模式-策略模式(Strategy Model)的更多相关文章
- [.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型)
[.net 面向对象程序设计深入](26)实战设计模式——策略模式 Strategy (行为型) 1,策略模式定义 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模 ...
- 设计模式 - 策略模式(Strategy Pattern) 具体解释
策略模式(Strategy Pattern) 具体解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26577879 本文版权全 ...
- 设计模式--策略模式(strategy)
1.策略模式(strategy ['strætədʒi]) 我的理解是:方案候选模式 (反正关键就是有很多的候选,哈哈) 看了很多例子,都是在说鸭子的,那个例子很好,在这里可以看 他们生产鸭子,我们就 ...
- java设计模式 策略模式Strategy
本章讲述java设计模式中,策略模式相关的知识点. 1.策略模式定义 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户.策略模式属于对象的 ...
- 设计模式——策略模式(Strategy Pattern)
写在前面: 直接将书中的例子用来作为记录自己学习的成果,不知道这样好不好,如果给原作者带来什么不利的影响不妨告知一声,我及时删掉. UML图: 抽象策略:Strategy package com.cn ...
- 说说设计模式~策略模式(Strategy)
返回目录 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.而对于客户端(UI)来说,可以通过IOC再配合工厂模块,实现动态策略的切换,策略模块通常于一个抽象策略对象(in ...
- C#设计模式——策略模式(Strategy Pattern)
一.概述我们来实现一个企业的工资系统,该企业中不同级别的员工工资算法都不相同,针对该问题,最容易想到的莫过于在代码中堆积一大堆if…else…语句或者是switch…case…语句.如果该企业中不同级 ...
- 设计模式-策略模式Strategy以及消灭if else
概述 如果在开发过程中,出现大量的if else或者switch case 语句,如果这些语句块中的代码并不是包含业务逻辑,只是单纯的分流方法,那么,每一个语句块中都是一个算法或者叫策略. 背景 比如 ...
- 设计模式---策略模式Strategy(对象行为型)
1. 概述 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式是对算法的封装,它把算法的责任和算法本身分割开,委派给不 ...
- 大话设计模式--策略模式 strategy -- C++实现实例
1. 策略模式: 它定义了算法家族, 分别封装起来,使他们之间可以相互替换,此模式让算法变化, 不会影响到使用算法的客户. 用相同的方法调用不同的算法,减少各种算法类与使用算法类之间的耦合. 实例中策 ...
随机推荐
- git命令行操作
从本地上传代码到仓库(假设已经建好仓库): 1.初始化: git init 2.将所有文件加入缓存区: git add * 3.提交当前工作空间的修改内容: git commit -m 'commit ...
- Atitit.项目修改补丁打包工具 使用说明
Atitit.项目修改补丁打包工具 使用说明 1.1. 打包工具已经在群里面.打包工具.bat1 1.2. 使用方法:放在项目主目录下,执行即可1 1.3. 打包工具的原理以及要打包的项目列表1 1. ...
- Asp.NET + SQLServer 部署注意事项
1. 内存设置最大值(如果不设置, 会造成内存占用太大,带来性能问题) IIS 设置最大内存 sqlserver 设置最大内存
- 找到第k个最小元----快速选择
此算法借用快速排序算法. 这个快速选择算法主要利用递归调用,数组存储方式.包含3个文件,头文件QuickSelect.h,库函数QuickSelect.c,测试文件TestQuickSelect. 其 ...
- CYQ.Data V5 分布式自动化缓存设计介绍
前方: 其实完成这个功能之前,我就在思考:是先把想法写了来,和大伙讨论讨论后再实现,还是实现后再写文论述自己的思维. 忽然脑后传来一个声音说:你发文后会进入发呆阶段. 所以还是静下心,让我轻轻地把代码 ...
- JS模块化开发:使用SeaJs高效构建页面
一.扯淡部分 很久很久以前,也就是刚开始接触前端的那会儿,脑袋里压根没有什么架构.重构.性能这些概念,天真地以为前端===好看的页面,甚至把js都划分到除了用来写一些美美的特效别无它用的阴暗角落里,就 ...
- 让tomcat支持中文cookie
这的确是一个不正常的需求,按照规范,开发者需要将cookie进行编码,因为tomcat不支持中文cookie. 但有时候,你不得不面对这样的情况,比如请求是由他人开发的软件,比如,浏览器控件发出的. ...
- python的拷贝(深拷贝和浅拷贝)
今天看了几篇关于python拷贝的博文,感觉不太清楚,所以我就自己做实验试一下,特此记录. 拷贝是针对组合对象说的,比如列表,类等,而数字,字符串这样的变量是没有拷贝这一说的. 实现拷贝有: 1.工厂 ...
- 关于JavaScript中的delete操作
关于JavaScript中的delete操作 看到一道题,是这样的: (function(x){ delete x; return x; })(1); 1 null undefined Error 我 ...
- EventBus总线讲解
在我们公司经常用到总线,具体的总线是什么让我理解我也不清楚,但是在这几个月下来,我已经知道总线如何使用,现在加上示例讲解总线如何使用. 1. 首先我们的新建一个类,这个类其实是用于总线传递的模型 us ...