首先一样上策略模式的UML类图:
分析: 一般抽象策略角色可以是一个interface,然后提供了不同的implements(ConcreteStrategyA,ConcreteStrategyB,ConcreteStrategyC);
Context 环境角色 和 Strategy是聚合关系。
策略模式提供了数据 和 算法的分离,用不同的ConcreteStrategy去初始化Context的成员变量Strategy的实例(upcast),将实现 数据 和算法 的重组。
下面具体举一个例子
interface Print{
void printsome();
}
class Print_1 implements Print{
public void printsome(){
System.out.println("print 1");
}
}
class Print_2 implements Print{
public void printsome(){
System.out.println("Print 2");
}
}
class Print_3 implements Print{
public void printsome(){
System.out.println("Print 3");
}
}
class Strategy{
Print print = null;
Strategy(Print print){
this.print = print;
}
Strategy(){}
void printsome(){
if(print == null){
System.out.println("Print 0");
}else{
print.printsome();
}
}
}
class Go{
public static void main(String args[]){
Strategy strategy1 = new Strategy();
Strategy strategy2 = new Strategy(new Print_1());
Strategy strategy3 = new Strategy(new Print_2());
Strategy strategy4 = new Strategy(new Print_3());
strategy1.printsome();
strategy2.printsome();
strategy3.printsome();
strategy4.printsome();
}
}
interface Print 相当于Strategy,Print_1,Print_2,Print_3就是ConcreteStrategyX,
Context就是class Strategy。
当然 javaAPI中也有许多地方用到了Strategy design pattern,比如对于java.util.TreeSet 可聚合不同的“比较函数”。
对于 TreeSet<T>
如果T 实现了 Comparable<T>接口。
java.lang
public Comparable<T>{
int compareTo(T o)
}
那么在构建TreeSet(红黑树),采用其来比较元素大小(默认),如果T没有实现Comparable<T>接口,或者想用其他的比较大小的算法,就向TreeSet<T>的构造函数中传入一个实现了Comparator接口的类的对象,那么在构建TreeSet的时候就会使用该比较算法去比较T的大小关系。这也就是是实现了,比较算法 和 TresSet的分离。一个TreeSet可以使用不同的大小比较算法,从而组织成不同的tree。
java.util
public Comparator<T>{
int compare(T o1, T o2);
boolean equals(Object obj);
}
以下代码写了2个TreeSet<Integer> 在构造函数中一个没有传入Comparator<Integer>,即采用默认的Integer实现的Comparable<Integer>来比较Integer的大小(顺序),另一个传入了Comparator<Integer>,即用Comparator<Integer>来比较。
package learn;
import java.util.TreeSet;
import java.util.Comparator;
class Go{
public static void main(String args[]){
TreeSet<Integer> ts1 = new TreeSet<Integer>();
TreeSet<Integer> ts2 = new TreeSet<Integer>(new Comparator<Integer>(){
public int compare(Integer I1, Integer I2){
return I2.compareTo(I1);
}
});
ts1.add(10);
ts1.add(7);
ts1.add(8);
ts2.add(10);
ts2.add(7);
ts2.add(8);
System.out.println(ts1);
System.out.println("--------------");
System.out.println(ts2);
}
}
最后给一个自定义类的结构,需要自己实现 Comparable<T>的代码:
package learn;
import java.util.TreeSet;
import java.util.Comparator;
class MyStyle implements Comparable<MyStyle>{
int a = 0;
int b = 0;
MyStyle(int a, int b){
this.a = a;
this.b = b;
}
public int compareTo(MyStyle my){
return a > my.a ? 1 : (a == my.a ? 0 : -1);
}
public String toString(){
return "a = " + a + " b = " + b;
}
}
class MyCompare implements Comparator<MyStyle>{
public int compare(MyStyle ms1, MyStyle ms2){
return ms1.b > ms2.b ? 1 : (ms1.b == ms2.b ? 0 : -1);
}
}
class Go{
public static void main(String args[]){
TreeSet<MyStyle> st1 = new TreeSet<MyStyle>();
TreeSet<MyStyle> st2 = new TreeSet<MyStyle>( new MyCompare());
MyStyle my1 = new MyStyle(10,3), my2 = new MyStyle(3,10), my3 = new MyStyle(5, 19);
st1.add(my1); st2.add(my1);
st1.add(my2); st2.add(my2);
st1.add(my3); st2.add(my3);
System.out.println(st1);
System.out.println(st2);
}
}
- 大小: 33 KB
分享到:
相关推荐
【Java设计模式】(2)策略模式Strategy
2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、设计模式之Strategy(策略) 10、设计模式之...
java 策略模式
走进设计模式之 策略模式(Strategy) 代码
创建模式: 设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) ...设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor
javase 设计模式的strategy pattern《JAVA与模式》之策略模式详解
设计模式-策略模式(Strategy)结合Android小知识讲解,简单明了
java实现策略模式、工厂模式、桥接模式
这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...
strategy(策略模式Java代码实现)
用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...
这种设计模式比较常用,希望能够帮助到大家。
主要介绍了Java设计模式之策略模式(Strategy模式)介绍,Strategy是属于设计模式中对象行为型模式,要是定义一系列的算法,这些算法一个个封装成单独的类,需要的朋友可以参考下
策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4 J2EE 模式 这些设计模式特别关注表示层。这些模式是由 Sun Java Center 鉴定的。 MVC 模式(MVC Pattern) 业务代表...
《java设计模式(第2版)》通过一个完整的java项目对经典著作design patterns一书介绍的23种设计模式进行了深入分析与讲解,实践性强,却又不失对模式本质的探讨。本书创造性地将这些模式分为5大类别,以充分展现各个...
应用java的Strategy模式设计思想开发的小型电子商务系统简单模拟
C#面向对象设计模式 (行为型模式) Strategy 策略模式 视频讲座下载
《Head First设计模式》(中文版)共有14章,每章都介绍了几个设计模式,完整地涵盖了四人组版本全部23个设计模式。前言先介绍这本书的用法;第1章到第 11章陆续介绍的设计 5b4 式为Strategy、Observer、Decorator、...
设计模式C++学习之策略模式(Strategy)
C#面向对象设计模式纵横谈(23):(行为型模式) Strategy 策略模式