首先一样上策略模式的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编程中,有23种经典的GoF(Gang of Four)设计模式,它们被分为三大类:创建型、结构型和行为型。本资源集合了这些模式的详细解释与源码分析,旨在帮助开发者深入理解和应用设计模式。 1. 创建型模式...
在Java编程语言中,设计模式的应用广泛且至关重要,有助于提高代码的可读性、可维护性和可扩展性。 一、单例模式(Singleton) 单例模式确保一个类只有一个实例,并提供一个全局访问点。在Java中,可以通过双重检查...
《常见的23个设计模式详解》一书深入探讨了软件工程领域中最为广泛接受和应用的设计模式,旨在帮助不同层次的开发人员、系统分析师及架构师掌握这些模式的核心概念与实践技巧。本书不仅覆盖了从初级到高级的技术细节...
### Java 23种设计模式详解 #### 一、设计模式概述 设计模式是一种编码实践,旨在通过标准化的解决方案来解决常见的软件设计问题。这些模式不仅有助于提高代码的可读性和可维护性,还能增强软件的灵活性和扩展性。...
### Java二十三种设计模式详解 #### 引言:设计模式的重要性 设计模式是软件工程领域的一种重要概念,它提供了一系列解决常见问题的模板。在Java编程中,掌握设计模式可以提升代码的质量、可读性和可维护性。下面...
### Java设计模式详解 在Java开发领域中,设计模式是一种被广泛接受且普遍使用的解决方案集,旨在解决软件设计中常见的问题。本文将详细介绍Java中的23种设计模式,并结合给定文件的部分内容进行深入解析。 #### 1...
2. **常用设计模式详解** - **单例模式**:确保一个类只有一个实例,并提供全局访问点,常用于配置中心、缓存管理等场景。 - **工厂模式**:提供一个接口来创建相关或依赖对象的家族,而无需指定具体类。 - **...
### Java常用设计模式—追美眉技术详解 #### 设计模式概述 设计模式是一种软件设计中的通用解决方案,它描述了一类问题以及解决该问题的方法。通过应用这些模式,开发人员可以编写出更易于理解、扩展和维护的代码...
### Java23种设计模式详解 #### 前言:设计模式的重要性 设计模式作为软件工程领域的一个重要组成部分,对于提升软件质量和开发效率具有不可替代的作用。尤其在Java这种广泛应用于企业级应用开发的语言中,设计...
### Java23中设计模式详解 #### 创建型模式 **1. Singleton(单例模式)** - **定义**:确保某个类只有一个实例存在,并提供一个全局的访问点。 - **应用场景**:适用于需要频繁实例化的资源密集型对象,如数据库...
### Java 23种设计模式详解 #### 一、单例模式(Singleton) 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式经常被用于那些需要频繁实例化然后销毁的对象,或者...
### Java的23种设计模式详解 #### 一、引言 设计模式是软件工程领域的一个重要概念,它提供了一套解决常见问题的有效方案。在Java编程中,掌握设计模式对于提升代码质量和可维护性至关重要。本文将详细介绍23种经典...
### Java设计模式详解 #### 一、概述 Java设计模式是指在软件开发过程中,为了解决常见问题而形成的一系列经过验证的解决方案。这些模式能够帮助开发者更好地组织代码,提高软件的灵活性、可复用性和可维护性。...
《Java设计模式实战详解》 在Java编程领域,设计模式是一种通用、可重用的解决方案,用于解决在软件设计中常见的问题。这个压缩包“java-design-patterns-master”显然是一个专注于Java设计模式的学习资源,旨在...
### Java设计模式详解 设计模式是在软件开发过程中,为解决特定问题而提炼出的一套可复用的解决方案。本文将详细介绍GoF(Gang of Four)提出的23种设计模式,帮助读者深入理解每种模式的原理、应用场景及其实现...
### Java设计模式详解 #### 策略模式 (Strategy Pattern) **定义:** 策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。该模式让算法的变化独立于使用算法的客户。 **应用场景:** 当一...