案例一:美团与支付平台合作
美团可以选择不同的支付平台,每次只能选一个
解决方法1:使用分支实现.
问题:当有新的支付商出现,或者有些支付方不再合作时,必须修改分支。
【美团接口】
package com.msb.meituan;
/*
*案例说明,在美团外卖,要实现微信或支付宝支付
* 1.美团外卖要制定接口:在线支付
* 2.微信、支付宝实现接口
* */
public interface Mtwm {
//在线支付功能
void payOnline();
}
【AliPay 类】
package com.msb.meituan;
public class AliPay implements Mtwm {
@Override
public void payOnline() {
System.out.println("我已经点了外卖,正在使用支付宝支付");
}
}
【WeChat 类】
package com.msb.meituan;
public class WeChat implements Mtwm {
@Override
public void payOnline() {
//具体实现微信支付的功能
System.out.println("我已经点了外卖,正在使用微信支付");
}
}
【测试类】
package meituan2;
public class Test {
public static void main(String[] args) {
//定义字符串,用来模拟前台的支付方式
String str = "微信";
switch(str){
case "微信":
pay(new WeChat());//调用微信支付new WeChat().payOnline()
break;
case "支付宝":
//new AliPay().payOnline();//调用阿里支付
pay(new AliPay());
break;
default:
System.out.println("无法支付");
break;
}
}
/* //微信支付
public static void pay(WeChat wc){
wc.payOnline();
}
//支付宝支付
public static void pay(AliPay ap){
ap.payOnline();
}*/
//多态提高代码扩展性
public static void pay(Mtwm mt){
mt.payOnline();
}
}
解决方法2:使用反射实现.
【测试类】
package meituan2;
import java.lang.reflect.Method;
public class Test1 {
public static void main(String[] args) throws Exception {
//定义一个字符串,用来模拟前台的支付方式
String str = "meituan2.WeChat";//微信类的全限定路径
//反射,下面的代码,在以后增加、减少支付方式时候,不需要再修改。
Class cls = Class.forName(str);
Object o = cls.newInstance();
Method method = cls.getMethod("payOnline");
method.invoke(o);
}
}
二、反射概念
在运行状态下,获取类的所有属性和方法信息,调用对象的任意方法和属性。
这种动态获取信息、动态调用方对象方法的功能称为java语言的反射机制。
三、获取类的字节码信息
package com.msb.reflecttest;
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
//获取Person类的字节码信息,目的是使用对象的方法,当有对象了,就不用获取字节码了。
// 有四种方式
//1.不常用
Person p = new Person();
Class c1 = p.getClass();
System.out.println(c1);//class com.msb.reflecttest.Person
//2.不常用
Class c2 = Person.class;
System.out.println(c2);
//3.Class.forName
Class c3 = Class.forName("com.msb.reflecttest.Person");
System.out.println(c3);
//4.类的加载器
ClassLoader loader = Test.class.getClassLoader();
Class c4 = loader.loadClass("com.msb.reflecttest.Person");
System.out.println(c4);
}
}
四、class类
class类的具体实例:
(1)类
(2)接口
(3)注解
(4)数组
(5)基本数据类型
(6)void
package com.msb.reflecttest;
public class Test {
public static void main(String[] args) throws ClassNotFoundException {
Class c5 = Person.class;
Class c6 = Comparable.class;
Class c7 = Override.class;
int[] a = {1,2,3};
int[] b = {4,5,6};
Class c8 = a.getClass();
Class c9 = b.getClass();
System.out.println(c8==c9);//true
Class c10 = int.class;
Class c11 = void.class;
}
}