`

java 策略(strategy)设计模式详解,和具体java 代码解析

 
阅读更多
首先一样上策略模式的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
分享到:
评论

相关推荐

    java23种设计模式详解+源码(绝对详解)

    在Java编程中,有23种经典的GoF(Gang of Four)设计模式,它们被分为三大类:创建型、结构型和行为型。本资源集合了这些模式的详细解释与源码分析,旨在帮助开发者深入理解和应用设计模式。 1. 创建型模式...

    23中设计模式详解

    在Java编程语言中,设计模式的应用广泛且至关重要,有助于提高代码的可读性、可维护性和可扩展性。 一、单例模式(Singleton) 单例模式确保一个类只有一个实例,并提供一个全局访问点。在Java中,可以通过双重检查...

    Java 23种设计模式及例子

    ### Java 23种设计模式详解 #### 一、设计模式概述 设计模式是一种编码实践,旨在通过标准化的解决方案来解决常见的软件设计问题。这些模式不仅有助于提高代码的可读性和可维护性,还能增强软件的灵活性和扩展性。...

    Java二十三种设计模式

    ### Java二十三种设计模式详解 #### 引言:设计模式的重要性 设计模式是软件工程领域的一种重要概念,它提供了一系列解决常见问题的模板。在Java编程中,掌握设计模式可以提升代码的质量、可读性和可维护性。下面...

    java设计模式.txt

    ### Java设计模式详解 在Java开发领域中,设计模式是一种被广泛接受且普遍使用的解决方案集,旨在解决软件设计中常见的问题。本文将详细介绍Java中的23种设计模式,并结合给定文件的部分内容进行深入解析。 #### 1...

    图解Java设计模式笔记总结word版本.rar

    2. **常用设计模式详解** - **单例模式**:确保一个类只有一个实例,并提供全局访问点,常用于配置中心、缓存管理等场景。 - **工厂模式**:提供一个接口来创建相关或依赖对象的家族,而无需指定具体类。 - **...

    JAVA常用设计模式-追美眉技术详解.doc

    ### Java常用设计模式—追美眉技术详解 #### 设计模式概述 设计模式是一种软件设计中的通用解决方案,它描述了一类问题以及解决该问题的方法。通过应用这些模式,开发人员可以编写出更易于理解、扩展和维护的代码...

    Java23种设计模式(Patterns in Java)

    ### Java23种设计模式详解 #### 前言:设计模式的重要性 设计模式作为软件工程领域的一个重要组成部分,对于提升软件质量和开发效率具有不可替代的作用。尤其在Java这种广泛应用于企业级应用开发的语言中,设计...

    Java23中设计模式

    ### Java23中设计模式详解 #### 创建型模式 **1. Singleton(单例模式)** - **定义**:确保某个类只有一个实例存在,并提供一个全局的访问点。 - **应用场景**:适用于需要频繁实例化的资源密集型对象,如数据库...

    Java 23种设计模式

    ### Java 23种设计模式详解 #### 一、单例模式(Singleton) 单例模式是一种常用的软件设计模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式经常被用于那些需要频繁实例化然后销毁的对象,或者...

    java的23种设计模式

    ### Java的23种设计模式详解 #### 一、引言 设计模式是软件工程领域的一个重要概念,它提供了一套解决常见问题的有效方案。在Java编程中,掌握设计模式对于提升代码质量和可维护性至关重要。本文将详细介绍23种经典...

    Java设计模式

    ### Java设计模式详解 #### 一、概述 Java设计模式是指在软件开发过程中,为了解决常见问题而形成的一系列经过验证的解决方案。这些模式能够帮助开发者更好地组织代码,提高软件的灵活性、可复用性和可维护性。...

    java-design-patterns-master_JAVAdesignpattens_java_design_

    《Java设计模式实战详解》 在Java编程领域,设计模式是一种通用、可重用的解决方案,用于解决在软件设计中常见的问题。这个压缩包“java-design-patterns-master”显然是一个专注于Java设计模式的学习资源,旨在...

    java 设计模式(中文)

    ### Java设计模式详解 设计模式是在软件开发过程中,为解决特定问题而提炼出的一套可复用的解决方案。本文将详细介绍GoF(Gang of Four)提出的23种设计模式,帮助读者深入理解每种模式的原理、应用场景及其实现...

    java设计模式

    ### Java设计模式详解 #### 策略模式 (Strategy Pattern) **定义:** 策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。该模式让算法的变化独立于使用算法的客户。 **应用场景:** 当一...

Global site tag (gtag.js) - Google Analytics