Java代码应该怎么和这个接口java对接银行接口

Java 中的接口有什么作用?
例如我定义了一个接口,但是我在继承这个接口的类中还要写接口的实现方法,那我不如直接就在这个类中写实现方法岂不是更便捷,还省去了定义接口?接口在java中的作用是什么?个人觉得只是一种规范。大家的看法呢?
100 个回答
能问这个问题,说明(1)你很会思考(2)编程水平还是处于起步阶段。“接口是个规范”,这句没错。“不如直接就在这个类中写实现方法岂不是更便捷”,你怎么保证这个接口就一个类去实现呢?如果多个类去实现同一个接口,程序怎么知道他们是有关联的呢?既然不是一个类去实现,那就是有很多地方有用到,大家需要统一标准。甚至有的编程语言(Object-C)已经不把接口叫 interface,直接叫 protocol。统一标准的目的,是大家都知道这个是做什么的,但是具体不用知道具体怎么做。比如说:我知道 Comparable 这个接口是用来比较两个对象的,那么如何去比较呢?数字有数字的比较方法,字符串有字符串的比较方法,学生(自己定义的类)也有自己的比较方法。然后,在另外一个负责对象排序(不一定是数字喔)的代码里面,肯定需要将两个对象比较。这两个对象是什么类型呢?Object a,b?肯定不行,a & b 这样的语法无法通过编译。int a,b?也不行?一开始就说了,不一定是数字。....所以,Comparable 就来了。他告诉编译器,a b 两个对象都满足 Comparable 接口,也就是他们是可以进行比较的。具体怎么比较,这段程序不需要知道。所以,他需要一些具体的实现,Comparable 接口有一个方法,叫 compareTo。那么这个方法就是用来取代 &、& 这样的运算符。因为运算符是编译器保留给内置类型(整数、浮点数)进行比较用的,而不是一个广义的比较运算。如果你可以明白 JDK 自身库里面诸如 Comparable 这样已经有的接口,那么就很容易理解自己在开发程序的时候为什么需要用到接口了。
这是一个初学者非常常见的问题。例如我定义了一个接口,但是我在继承这个接口的类中还要写接口的实现方法,那我不如直接就在这个类中写实现方法岂不是更便捷,还省去了定义接口?接口就是个招牌。比如说你今年放假出去杭州旅游,玩了一上午,你也有点饿了,突然看到前面有个店子,上面挂着KFC,然后你就知道今天中饭有着落了。KFC就是接口,我们看到了这个接口,就知道这个店会卖炸鸡腿(实现接口)。那么为神马我们要去定义一个接口涅,这个店可以直接卖炸鸡腿啊(直接写实现方法),是的,这个店可以直接卖炸鸡腿,但没有挂KFC的招牌,我们就不能直接简单粗暴的冲进去叫服务员给两个炸鸡腿了。要么,我们就要进去问,你这里卖不卖炸鸡腿啊,卖不卖汉堡啊,卖不卖圣代啊(这就是反射)。很显然,这样一家家的问实在是非常麻烦(反射性能很差)。要么,我们就要记住,中山路108号卖炸鸡,黄山路45号卖炸鸡(硬编码),很显然这样我们要记住的很多很多东西(代码量剧增),而且,如果有新的店卖炸鸡腿,我们也不可能知道(不利于扩展)。
你写接口你写实现,就不用写接口了。我写接口你实现,接口不就用上了。我不给你规定好了,你怎么知道该实现哪些内容呢。更进一步,我写接口你实现,你今天不在,我明天出差,程序后天交工,那我今天必须把调用这个接口的代码写好。所以就需要接口中有函数,有明确的函数签名。我写个接口,再把调用函数写好,明天你把接口实现了,传个实例进来,交工。interface换个叫法就是contract,有点合同的意思。A实现了这个接口,代表A承诺能做某些事情。B需要一些能做某些事情的东西,于是B要求,必须实现了A接口,才能被我调用。实际上也就是个“规范”。
1. 接口是一种规范很好,你已经知道接口是一种规范了!下面这张图是我们生活中遇到的接口:电源插座接口。没错!它就是一种规范,中国2010年制定的插座标准。2. 为什么需要规范呢?因为有了接口规范:任何电器只有有符合规范的插头,就可以获得电力任何厂家(西门子插座,TCL插座,公牛插座...)按照规范进行制作,就能进行供电每个厂家插座的生产技术、工艺都不一样,因为接口的implementation可以不一样,但是并不影响电器的正常工作。插座的内部实现对于电器来说是完全屏蔽的。对于软件开发是类似的:按照接口规范进行方法调用,就能获得所期望的功能按照接口规范实现接口的的方法,就能提供所期望的功能接下来是重点了:软件开发大多是一个协作性的工作:电器和插座分别是不同人完成的,有了接口大家就能分头开干,都按照接口来办事,各自做完就能轻松地整合到一起。各部分的测试也更加方便。软件需要不断演化:今天你用了公牛的插座,过了一年你可能换个西门子的插座,要做没有这套国家接口标准,各自为政,那估计你是换不了插座了。你想想,咱们每次去美国出差,都得带个转接头,否则就跪了,多不方便啊,因为接口规范不同啊!(这些个转接头你是不是闻道一种浓浓的Adapter模式的味道)。3. 什么时候需要通过接口建立规范为了抽象系统的某种公共行为,或者封装变化性,进行系统设计的时候你需要抽取出接口,这样将来你的系统将更加灵活。而你所说的,直接写实现的方式在确定性的场景下当然也可以,不涉及到分工协作、变化性、测试方便等因素时,当然用不着接口了。比如一般情况下你犯不着为一个Pojo的getter和setter也弄个接口和实现分离。所以面向对象的大神们孜孜不倦地教导我们说:接口和实现分离,面向接口编程。最后推荐一篇Java接口的基础教程:欢迎大家访问
获取更多Java内容
大家说的都很对,我再补充一点。接口在开发过程中可以快速分离工作内容。比如调用者在写业务逻辑的时候需要一个功能,可能是数据库访问,或者复杂计算,但是他的工作专注于实现业务逻辑,不想分开精力去做底层实现,那么他只需要先实现一个接口,定义了规范,然后就可以继续他的业务逻辑代码了。而实现者可以根据这个接口规范,做具体的实现。这样通过使用接口就可以快速的分离工作内容,达到团队并行工作的目的。此外,如果规范是通过接口定义的,那么当你这个功能有多个实现时,你只要实现了这个接口,那么可以快速的替换具体实现,做到代码层面的完全可以分离。总结起来就一句话:接口或者规范可以在开发过程中做到分离。
接口是软件工程最重要的概念,在java上要格外感谢Spring的贡献。这个概念对于新人来讲,是比较难理解的,最重要的原因就是需要有一定的代码量,特别是做过一些项目的重构,维护,变更等事情的时候感触才会更深一些。1 “接口+实现”最常见的优势就是实现类和接口分离,在更换实现类的时候,不用更换接口功能。比较常见的例子是发送短信。一般发送短信的场景包括注册用户,找回密码,重要通知,修改交易密码等。短信现在的结构是先接上各家短信通道公司,再经由联通移动等发送出去。一般而言,短信分成两种,一种注册短信,一次只发给用户一条。这种短信到达率比较高,可能会在99%以上,也要看各种短信通道方,更会区分移动和联通。另外一种是营销短信,这种短信常见于“某公司3周年大庆,1元领取程序员鼓励师”之类的。这种短信到达率非常低。而且也经常会被封掉。但是短信又是注册的第一步,用户体验做的再好,手机收不到验证码也没用。所以觉见的做法是,会备用两个或者是多个短信通道。刚刚已经讲过了,调用短信接口的地方比较多,可能是用户发起的,也可能是程序检测到某种行为触发的。也就是说,会有多个地方调用短信接口,那么我们这个时候要解决的问题就是,能否在更换短信通道方的时候,不更改其他模块中被引入的代码?接口在这个时候就完美的实现了这个功能点。无论是哪个模块,我要发送的内容和预期的结果是一致的,具体是用哪家短信通道的实现类,不重要。所以通常是一个SMSService做为接口,不同的公司因为有不同的实现方式,所以会有多个实现类,比如说SMSService{CorpA}Impl,SMSService{CorpB}Impl。这是一个完美的抽象,无论未来有多少种短信公司接入,无论短信公司的营销人员送了多少个香吻给公司的商务总监,程序员总是能够开心的完成功能。2.这对于做单元测试也非常有帮助。如果你是一个有了那么点经验的程序员,如果你还没有习惯TDD的开发。可以体验一下这种写法。还是拿短信为例。先写一个SMSServiceTest。然后写一个Test方法。
这个时候什么都没有,不用管。先直接这么写。int code=SMSSevice.sendTextMessage(mobile,content,type);这个时候IDE会提示你没有这个SMSService,用代码自动生成工具去创建这么一个接口出来。再根据提示把方法创建出来。再写 SMSService smsService=new SMSServiceCorpaImpl();再根据代码把实现类生成了。一般来说IDE会自动留一个空的方法。不用管。这里只是一个简单的例子,但是你发现,当你用TDD的这种方式去写代码的时候,完全不用关系SMSService是怎么内部实现的。你只需要继续写你的单元测试代码好了,明确的知道这个SMSService要做的功能是发送短信,需要传递手机号,内容,类型,返回一个状态码。那么接着说为什么对单元测试很方便?一般而言会用Spring配置Bean,所以实际上你的单元测试代码也不用有改动,无论是测试哪一个实现类,都只通过更改配置文件就可以完成。想想,如果没有接口呢?是不是要对每一个短信通道单独写一个单元测试的方法?3.对于不需要频繁更变实现类的方法,是不是就可以不用写接口了?答案是No。整个系统架构的代码可以单纯认为有四部分构成。Model+Interface+Service+UtilModel是纯粹的Pojo,贫血模型,Inteface和Service是接口和实现分开的,Util是全项目通用,或者是跨项目通用的,跟业务逻辑没有任何关系的。写接口最大的好处就是在你写的Controller代码,或者是Service里的主要业务逻辑代码的时候,屏蔽掉细节。写一个业务逻辑的时候,比如说修真院的加入班级。第一步,做校验,用户是否为空,班级是否不存在,是否已经加入了班级等等。第二步,更新班级和用户的关系表,更新班级总人数,更新职业总人数,更新用户的最新班级ID。第三步,发送系统通知,告知用户加入班级成功。如果说不用接口,只用实现类的话,第一种方式就是把所有的代码都写在这个Controller里去,代码会非常非常繁琐,一个函数突破几千行轻轻松松,而且改动起来很麻烦。第二种方式就是抽象出来函数。这种方式在某种程度上能够解决代码块大的问题,但是你必须要New一个实现类出来,想想在上述逻辑中,需要new几个实现类?这些实现类就会被New的各处都是,甚至改个名字都很蛋疼。但是如果你使用接口的话,你会发现,接口是强制于你去将复杂的业务逻辑抽象成具体做的事儿。比如说,if(user==null){
// to do something}就变成了CheckUser(uid)这么一个接口。实现类也明确了自已要做的事情。从某种程度上来说,抽象成一个私有方法也能解决这个问题,但是一般都会推荐,如果你发现你写了很多私有方法,要么是他们可以继续演化成一个util,要么是可以成为一个Service。嗯,说的有点乱。
日常生活中,两个实体之间进行连接的部分称为接口。如电脑和U盘连接的标准USB接口。接口可以确保不同实体之间的顺利连接。如不同的电脑厂家和U盘厂家只要按照相同的USB接口进行生产,那么所有的电脑和U盘就可以顺利的连接起来。
(1)Java编程领域中,接口可以为不同类顺利交互提供标准。例如:老师让学生张三和李四一起完成,java程序来模拟营业员和计算器的行为。张三和李四进行工作分工,张三写计算机器,李四写营业员类。
张三和李四没有定义接口会出现的问题如下:
张三先定义了一个计算器类Calculator类并提供计算的方法,注方法的名称
public class Calculator{
public double count(double salary,double bonus){
return salary+
李四定义了代表营业员的Seller类:注意这里计算器的方法
class Seller{
S//营业员的名称
public Seller(String name, Calculator calculator) {
this.name =
this.calculator =
//计算的方法
public void
quote(double
salary,double
System.out.println(name+"说:您好:请支付"+calculator.countMoney(salary,
bonus)+"元。");
我们看到李四开发的时候想使用张三已经写好的计算器的类,李四想当然的认为计算钱的方法是countMoney,但是张三写计算器的时候使用的方法是count,那么李四的写的Seller类是错误的。
实现接口的好处如下:
为了保证张三和李四的书写的类可以正确的完成交互,李四定义了一个接口,并要求张三必须实现这个接口,接口的代码如下:
interface Icount{
public double
countMoney(double
salary,double bonus);
那么张三在写计算器Calculator;类的时候,实现Icount接口必须重写接口中的抽象方法。那么张三的代买就应该是如下的:
public class
Calculator implemenets Icount{
public double countMoney(double
salary,double
这样就李四的代码就可以正常的执行了。
(2)接口可以降低类的依赖性,提高彼此的独立性
张三现在觉得计算器类的名字改成SuperCalculator更合适那么张三写的类代码就应该如下:
public class SuperCalculator
implements Icount{
public double countMoney(double salary,double
return salary+
李四的代码如下注意这里计算的使用接口来声明:
class Seller{
S//营业员的名称
Icount calculator; //这里使用接口声明
public Seller(String name, Calculator calculator) {
this.name =
this.calculator =
//计算的方法
public void
quote(double
salary,double
System.out.println(name+"说:您好:请支付"+calculator.countMoney(salary, bonus)+"元。");
由以上的代码来看张三的类无论命名成什么李四的代码都不需要改,所以代码的依赖性降低,便于程序的维护。
(3)接口在使用的时候需要注意一下几点:
接口是系统中最高层次的抽象类型。
接口本身必须十分稳定,接口一旦定制,就不允许随意修改,否则对接口实现类以及接口访问都会造成影响。
之前没怎么考虑过这个问题。现在有空想想。看完别人的回答,比较认同接口应该是一种统一的标准,所以说如果涉及到 "变",那么怎么 "变",应该要有一种标准;并且如果相互协作的话,那么如何协作需要一个标准,有一种规范约束,相互协作就不能大家各自想怎么来就怎么来。变说到 "变",想到的就是策略模式了,如下图:你说如果没有这个 Strategy 接口,那么意味着没有统一的方法,这个时候客户端调用 Strategy 的时候,变的话,那么调用方很多代码也要变,比如说,原来是:@Resource(name = "concreteStrategyA")
public void doSomething(){
int a = strategy.Algorith...(param1);
如果写成这种形式@Resource(name = "concreteStrategyA")
private ConcreteStrategyA concreteStrategyA;
public void doSomething(){
int a = concreteStrategyA.Algorith...(param1);
那么,以后要 ConcreteStrategyA 变成 ConcreteStrategyB 的时候,就要修改两处地方:成员变量要变了。int a = concreteStrategyB.Algorith...(param1,param2);
因为 ConcreteStrategyA 和 ConcreteStrategyB 没有一个统一的约定,可能传参不一样。如果是原来接口的方式,那么就只需要修改一处地方了。这个就是我理解的 "变"。协作另外我是很认同
说的协作,
说的也是这个道理。因为当时自己工作的时候就遇到过,因为自己耽误了同事,所以当时让同事先写好接口,然后他测试的时候让他自己随便写一个实现类,然后固定return 返回值,具体实现我到时候再写,这样他就不需要等我了。但是,如果这个时候他不实现接口,写一个普通类,然后在这个普通类中写方法,我下次再补充这个方法,这种方式可以吗?其实我觉得也是可以的,但是就非常违反了开闭原则,因为我明天需要动这个实现类。但是接口这个方式就不一样了,我明天要写一个新类实现这个接口,接口类我是不动它的,这个是很符合开闭原则的。Ps:非要遵守这种原则吗?我也觉得不一定,只是感觉这种情况下不遵守比较恶心而已。最后接口针对 "变",那么可能有不变的地方,典型的就是我经常写的代码(囧ing)service 接口和 serviceImpl 实现类,以前使用 Hibernate 的话,还有 dao 和 daoImpl 实现类。这样写已经形成了习惯。自己当时写的时候也没考虑。现在仔细想想其实这些都是不太会变的,那么现在项目中使用它们有什么好处吗,就目前来说,是没有的(以后可能会有,但是目前项目规模不大,自己接触有限)。也就是说,完全可以用一个实现类来代替了接口。最后,希望有经验的同学可以 share 下实际的好处。(看 demo ,例子还是感觉很无趣的。。)
接口是一种抽象的方法比如你买了一台电脑,你拿它来上网,相当于这台电脑实现了“能上网”的接口。然后这台电脑忽然坏了,你换了一台ipad的,仍然可以拿来上网。对于你来说,它是否是电脑并不重要,重要的是它是否“能上网”。放进程序里,假设你有一个类叫“网民“,它只干一件事,那就是上网:class 网民 { public void 上网 (能上网的 东西) { 东西.上网(); }}那么当你使用这个类的时候,你可以给它一部电脑,也可以给一台ipad。如果你把”能上网“这个接口变成某一个类的方法,那网民类就要改写:class 网民 { public void 用电脑上网 (电脑) { 电脑.上网(); } public void 用iPad上网 (iPad) { iPad.上网(); }}忽然有一天,智能家居出现了,你发现家里的电视也能上网了,你就不得不更改”网民“类,加入另一个方法好让它能使用电视上网。你能问出这个问题是因为你没有设计API的经验,如果”网民“类是在一个API中,你就不能随意更改了,于是导致了即便出现了能上网的电视,网民还是无法使用的情况。
接口就是吉祥馄饨的招牌。你进去,都会在墙上挂着菜单,都会从冰箱里拿出一个个方便盒装的冷冻馄饨……但至于味道是不是完全一样(尤其是汤的味道),服务是不是好,卫生够不够格,就看各家店铺的具体实现了。
已有帐号?
无法登录?
社交帐号登录记住登录一个月发表随想还能输入:200字该用户最新代码编程随想&by by by by by by [java]代码库import java.io.BufferedR
import java.io.IOE
import java.io.InputStreamR
import java.io.OutputStreamW
import java.io.UnsupportedEncodingE
import java.net.HttpURLC
import java.net.URL;
import java.net.URLE
import java.util.HashM
import java.util.M
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import java.security.MessageD
* 快递鸟电子面单接口
* ID和Key请到官网申请:/ServiceApply.aspx
public class KdGoldAPIDemo {
private String EBusinessID="请到快递鸟官网申请/ServiceApply.aspx";
//电商加密私钥,快递鸟提供,注意保管,不要泄漏
private String AppKey="请到快递鸟官网申请/ServiceApply.aspx";
//请求url, 正式环境地址:http://api.kdniao.cc/api/Eorderservice
private String ReqURL="http://testapi.kdniao.cc:8081/api/Eorderservice";
* Json方式 电子面单
* @throws Exception
public String orderOnlineByJson() throws Exception{
String requestData= "{'OrderCode': ''," +
"'ShipperCode':'EMS'," +
"'PayType':1," +
"'ExpType':1," +
"'Cost':1.0," +
"'OtherCost':1.0," +
"'Sender':" +
"'Company':'LV','Name':'Taylor','Mobile':'','ProvinceName':'上海','CityName':'上海','ExpAreaName':'青浦区','Address':'明珠路73号'}," +
"'Receiver':" +
"'Company':'GCCUI','Name':'Yann','Mobile':'','ProvinceName':'北京','CityName':'北京','ExpAreaName':'朝阳区','Address':'三里屯街道雅秀大厦'}," +
"'Commodity':" +
"'GoodsName':'鞋子','Goodsquantity':1,'GoodsWeight':1.0}]," +
"'Weight':1.0," +
"'Quantity':1," +
"'Volume':0.0," +
"'Remark':'小心轻放'," +
"'IsReturnPrintTemplate':1}";
Map&String, String& params = new HashMap&String, String&();
params.put("RequestData", urlEncoder(requestData, "UTF-8"));
params.put("EBusinessID", EBusinessID);
params.put("RequestType", "1007");
String dataSign=encrypt(requestData, AppKey, "UTF-8");
params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
params.put("DataType", "2");
String result=sendPost(ReqURL, params);
//根据公司业务处理返回的信息......
* @param str 内容
* @param charset 编码方式
* @throws Exception
@SuppressWarnings("unused")
private String MD5(String str, String charset) throws Exception {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes(charset));
byte[] result = md.digest();
StringBuffer sb = new StringBuffer(32);
for (int i = 0; i & result. i++) {
int val = result[i] & 0
if (val &= 0xf) {
sb.append("0");
sb.append(Integer.toHexString(val));
return sb.toString().toLowerCase();
* base64编码
* @param str 内容
* @param charset 编码方式
* @throws UnsupportedEncodingException
private String base64(String str, String charset) throws UnsupportedEncodingException{
String encoded = Base64.encode(str.getBytes(charset));
@SuppressWarnings("unused")
private String urlEncoder(String str, String charset) throws UnsupportedEncodingException{
String result = URLEncoder.encode(str, charset);
* 电商Sign签名生成
* @param content 内容
* @param keyValue Appkey
* @param charset 编码方式
* @throws UnsupportedEncodingException ,Exception
* @return DataSign签名
@SuppressWarnings("unused")
private String encrypt (String content, String keyValue, String charset) throws UnsupportedEncodingException, Exception
if (keyValue != null)
return base64(MD5(content + keyValue, charset), charset);
return base64(MD5(content, charset), charset);
* 向指定 URL 发送POST方法的请求
* @param url 发送请求的 URL
* @param params 请求的参数集合
* @return 远程资源的响应结果
@SuppressWarnings("unused")
private String sendPost(String url, Map&String, String& params) {
OutputStreamWriter out =
BufferedReader in =
StringBuilder result = new StringBuilder();
URL realUrl = new URL(url);
HttpURLConnection conn =(HttpURLConnection) realUrl.openConnection();
// 发送POST请求必须设置如下两行
conn.setDoOutput(true);
conn.setDoInput(true);
// POST方法
conn.setRequestMethod("POST");
// 设置通用的请求属性
conn.setRequestProperty("accept", "*/*");
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent",
"Mozilla/4.0 ( MSIE 6.0; Windows NT 5.1;SV1)");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.connect();
// 获取URLConnection对象对应的输出流
out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
// 发送请求参数
if (params != null) {
StringBuilder param = new StringBuilder();
for (Map.Entry&String, String& entry : params.entrySet()) {
if(param.length()&0){
param.append("&");
param.append(entry.getKey());
param.append("=");
param.append(entry.getValue());
System.out.println(entry.getKey()+":"+entry.getValue());
System.out.println("param:"+param.toString());
out.write(param.toString());
// flush输出流的缓冲
out.flush();
// 定义BufferedReader输入流来读取URL的响应
in = new BufferedReader(
new InputStreamReader(conn.getInputStream(), "UTF-8"));
while ((line = in.readLine()) != null) {
result.append(line);
} catch (Exception e) {
e.printStackTrace();
//使用finally块来关闭输出流、输入流
if(out!=null){
out.close();
if(in!=null){
in.close();
catch(IOException ex){
ex.printStackTrace();
return result.toString();
分享到:更多共1 条评论
发表评论:评论须知:1、评论每次加2分,每天上限为30;2、请文明用语,共同创建干净的技术交流环境;3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。

我要回帖

更多关于 java项目中接口对接 的文章

 

随机推荐