import java.util.Arrays;
/**
* @author hint
* @creation date 2010-10-6 下午08:22:38
*
*
* 策略模式
*
*/
class Processor{
public String name(){
return getClass().getSimpleName();
}
public Object process(Object input){
return input;
}
}
class Upcase extends Processor{
@Override
public String process(Object input) {
return ((String)input).toUpperCase();
}
}
class Downcase extends Processor{
@Override
public String process(Object input) {
return ((String)input).toLowerCase();
}
}
class Splitter extends Processor{
@Override
public String process(Object input) {
return Arrays.toString((((String)input).split(" ")));
}
}
class Apply{
public static void process(Processor p,Object o){
System.out.println("using process "+p.name());
System.out.println(p.process(o));
}
}
public class StrategyPattern {
public static void main(String[] args) {
String abc = "Hello world, this is a strategy pattern !";
// String str = new String("Hello world, this is a strategy pattern !");
Apply.process(new Downcase(), abc);
System.out.println("1. "+abc);
/*Apply.process(new Upcase(), str);
System.out.println("2. "+str);
Apply.process(new Splitter(), str);*/
}
}
结果为:
using process Downcase
hello world, this is a strategy pattern !
1. Hello world, this is a strategy pattern !
对应的反汇编代码为:
// Compiled from StrategyPattern.java (version 1.6 : 50.0, super bit)
public class chapart9_interface.StrategyPattern {
// Method descriptor #6 ()V
// Stack: 1, Locals: 1
public StrategyPattern();
0 aload_0 [this]
1 invokespecial java.lang.Object() [8]
4 return
Line numbers:
[pc: 0, line: 58]
Local variable table:
[pc: 0, pc: 5] local: this index: 0 type: chapart9_interface.StrategyPattern
// Method descriptor #15 ([Ljava/lang/String;)V
// Stack: 4, Locals: 2
public static void main(java.lang.String[] args);
0 ldc <String "Hello world, this is a strategy pattern !"> [16]//从常量池中得到字符串对象("Hello world, this is a strategy pattern !"),并压入栈中;
2 astore_1 [abc]//取栈中数据(赋值给abc)
3 new chapart9_interface.Downcase [18]//创建对象Downcase
6 dup//复制栈顶压入栈
7 invokespecial chapart9_interface.Downcase() [20]
10 aload_1 [abc]//将对象abc引用存储在main方法局部变量1的位置
11 invokestatic chapart9_interface.Apply.process(chapart9_interface.Processor, java.lang.Object) : void [21]
14 getstatic java.lang.System.out : java.io.PrintStream [27]
17 new java.lang.StringBuilder [33]
20 dup
21 ldc <String "1. "> [35]
23 invokespecial java.lang.StringBuilder(java.lang.String) [37]
26 aload_1 [abc]//将对象abc引用存储在main方法局部变量1的位置
27 invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [40]
30 invokevirtual java.lang.StringBuilder.toString() : java.lang.String [44]
33 invokevirtual java.io.PrintStream.println(java.lang.String) : void [48]
36 return
}
分享到:
相关推荐
当我们将 String 型参数传递给方法时,实际上传递的是 String 对象的引用,而不是 String 对象本身。这个引用指向了 String 对象在内存中的真实地址。因此,当我们在方法内部改变 String 对象的值时,实际上是改变了...
这里的`CallbackFunc`是函数指针类型,它接受一个字符串和一个整型数组作为参数。 2. **C#中的委托类型**:在C#中,我们需要创建一个与C++回调函数匹配的委托类型。 ```csharp public delegate void ...
Java 参数传递机制详解 Java 中的参数传递机制是一个经久不息的讨论...Java 参数传递机制详解,揭开了 Java 中的参数传递机制的奥秘,详细分析了基本类型和对象作为参数传递的机制,并揭开了对象作为参数传递的迷惑。
- `String作为参数传递.txt` 中讨论了Java中的参数传递方式。Java总是按值传递,对于基本类型,传递的是实际的值;而对于对象,传递的是对象的引用(即内存地址)。即使在方法内部修改对象,也不会影响方法外部的...
2. **实例化新窗体并传递参数**:在源窗体中,当用户触发某个事件(如按钮点击)时,创建新窗体的实例,并将数据作为参数传递。 ```csharp private void btnOpenSecondForm_Click(object sender, EventArgs e) { ...
掌握参数的两种传递方式的(值传递和引用传递) 基本数据类型作为参数 类的对象作为参数 数组作为参数 String类作为参数
在PowerBuilder开发环境中,窗口之间的参数传递是一项基本且重要的功能,它使得不同界面间的数据交互变得可能。本文将深入探讨几种常见的参数传递方法,并详细解释它们的使用场景、优缺点及注意事项。 ### Power...
发送信号时,创建一个`MyStruct`实例并将其作为参数传递。接收端的槽函数会接收到这个实例并进行处理。 ```cpp MyStruct data; data.intValue = 10; data.stringValue = "Example"; sender->mySignal(data);...
这意味着,当我们将一个变量作为参数传递给方法时,实际上传递的是该变量的一个副本。 ##### 1. 值传递 - **原理**:传递的是变量的值,而不是变量本身的引用。这意味着方法内部对参数所做的任何修改都不会影响到...
二、参数传递 在创建线程时,我们常常需要向线程传递参数以便它能执行特定的任务。在 Delphi 中,我们可以通过重写 TThread 的 Execute 方法来接收和使用这些参数。Execute 方法是线程运行的核心,通常在这里处理...
### Silverlight参数传递 #### 背景介绍 Silverlight是一种强大的Web应用程序开发框架,它由微软开发并推出,主要用于创建丰富的互联网应用程序(RIA)。Silverlight支持多种编程语言,包括C#、VB.NET等,并且可以...
本讲主要聚焦于Spring MVC中的参数传递类型,探讨如何有效地从请求中提取不同类型的数据。 首先,Spring MVC支持的基本参数类型包括字符串、整型、浮点型等基本数据类型,以及它们的包装类。例如,通过在控制器方法...
在本例中,我们可以假设用户将操作数和运算符作为参数发送到服务器。例如,请求可能如下所示: ``` GET /simplecalculator?num1=5&num2=3&operator=+ ``` 或者,如果我们选择通过POST请求传递数据,可能如下: ``...
Python的`threading`模块提供了`Thread`类,参数可以通过初始化时的`args`参数传递,它接受元组作为参数: ```python import threading def thread_function(param): # 使用param进行任务处理 t = threading....
这个函数接受`JNIEnv`指针、`jobject`(Java对象的引用)和`jstring`(Java字符串)作为参数,并返回一个`jstring`。注意,字符串在Java和C/C++之间的处理方式不同: ```c++ #include "JNITest.h" JNIEXPORT ...
- 使用构造函数:创建新窗体实例时,可以将数据作为参数传递给构造函数。 - 使用公共属性或字段:设置源窗体的公共属性或字段,然后在目标窗体中访问它们。 - 使用事件:创建自定义事件,当需要传递数据时触发...
当这些类型的数据作为参数传递给方法时,实际上是将这些值的副本传递给了方法内的形式参数。这意味着对方法内形式参数的任何修改都不会影响到原始的实际参数。 **示例**: ```java public class Calculator { ...
当一个对象引用(如StringBuffer、ArrayList等)作为参数传递时,实际上是传递该对象引用的副本,而不是对象本身。这意味着,尽管方法内部的参数是副本,但它仍然指向同一块内存空间。因此,通过这个副本对对象的...
在 Mybatis 中,传递多个参数的一种常用做法是把多个参数都放在 Map 中,然后传递这个 Map 作为参数。例如: ```java public void insertAreaDivInfor(HashMap map); ``` 对应的 XML 代码为: ```xml insert into ...
这意味着当一个基本类型的变量作为参数传递给方法时,实际上是传递了一个副本,而不是原始值本身。因此,即使在方法内部改变了这个副本的值,也不会影响到原始变量的值。 #### 三、对象的参数传递 对于对象的参数...