關(guān)于接口的理解,接口從更深層次的理解,應(yīng)是定義,規(guī)范,約束,與實(shí)現(xiàn),名實(shí)分離的原則,的分離,我們?cè)谝话銓?shí)現(xiàn)一個(gè)系統(tǒng)的時(shí)候,通常是將定義與實(shí)現(xiàn)合為一體,不加分離的,我認(rèn)為最為理解的系統(tǒng)設(shè)計(jì)規(guī)范應(yīng)是所有的定義與實(shí)現(xiàn)分離,盡管這可能對(duì)系統(tǒng)中的某些情況有點(diǎn)繁煩.
接口的本身反映了系統(tǒng)設(shè)計(jì)人員對(duì)系統(tǒng)的抽象理解,接口應(yīng)有兩類:第一類是對(duì)一個(gè)體的抽象,它可對(duì)應(yīng)為一個(gè)抽象體(abstract class);第二類是對(duì)一個(gè)體某一方面的抽象,即形成一個(gè)抽象面(interface);一個(gè)體有可能有多個(gè)抽象面,抽象體與抽象面是有區(qū)別的。
設(shè)計(jì)接口的另一個(gè)不可忽視的因素是接口所處的環(huán)境(context,environment),系統(tǒng)論的觀點(diǎn):環(huán)境是系統(tǒng)要素所處的空間與外部影響因素的總和。任何接口都是在一定的環(huán)境中產(chǎn)生的,因此環(huán)境的定義及環(huán)境的變化對(duì)接口的影響是不容忽視的,脫離原先的環(huán)境,所有的接口將失去原有的意義。
按照組件的開發(fā)模型(3c),它們?nèi)呦噍o相成,各司一面,渾然一體,缺一不可,面向?qū)ο笫侵?我們考慮問題時(shí),以對(duì)象為單位,考慮它的屬性及方法,面向過程是指,我們考慮問題時(shí),以一個(gè)具體的流程(事務(wù)過程)為單位,考慮它的實(shí)現(xiàn),接口設(shè)計(jì)與非接口設(shè)計(jì)是針對(duì)復(fù)用技術(shù)而言的,與面向?qū)ο螅ㄟ^程)不是一個(gè)問題.
我希望的是盡量少的修改代碼,就能滿足他的需要,我可以抽象如下接口,以下為引用的內(nèi)容:
- package org.bromon.test;
- public interface db
- {
- java.sql.connection opendb(string url,string user,string password);
- void close();
- }
這個(gè)接口只定義兩個(gè)方法,沒有任何有實(shí)際意義的代碼,具體的代碼由實(shí)作這個(gè)接口的類來給出,比如mysql.java,以下為引用的內(nèi)容:
- package org.bromon.test;
- import java.sql.*;
- public class mysql implements db
- {
- private string url=”jdbc:mysql:localhost:3306/test”;
- private string user=”root”;
- private string password=””;
- private connection conn;
- public connection opendb(url,user,password)
- {
- //連接數(shù)據(jù)庫(kù)教程的代碼
- }
- public void close()
- {
- //關(guān)閉數(shù)據(jù)庫(kù)
- }
- }
下面看實(shí)例,代碼如下:
- <?php
- interface js{
- function ys($a,$b);
- }
- class af implements js{
- function ys($a,$b){
- return "加法運(yùn)算......結(jié)果為:".($a+$b);
- }
- }
- class jf implements js{
- function ys($a,$b){
- return "減法運(yùn)算......結(jié)果為:".($a-$b);
- }
- }
- class aaf implements js{
- function ys($a,$b){
- return "乘法運(yùn)算......結(jié)果為:".($a*$b);
- }
- }
- class jjf implements js{
- function ys($a,$b){
- return "除法運(yùn)算......結(jié)果為:".($a/$b);
- }
- }
- class modf implements js{
- function ys($a,$b){
- return "取模運(yùn)算......結(jié)果為:".($a % $b);
- }
- }
- class china implements js{
- public $varl=null;//這里直接:public $varl = new nothingx(); 會(huì)出錯(cuò)。
- function __construct(){
- $this->varl = new nothingx();
- }
- function ys($a,$b){
- return $this->varl->say();
- }
- }
- /*也可以用繼承的方式實(shí)現(xiàn)喲:
- class china extends nothingx implements js{
- function ys($a,$b){
- return parent::say();
- }
- }
- */
- class nothingx{
- function say(){
- return "我什么運(yùn)算都不做...只是為了實(shí)現(xiàn)<font color=#990000><b>‘耦合設(shè)計(jì)模式’</b></font>...我是出來打醬油的......";
- }
- }
- class test{
- private $one;
- private $two;
- public function __construct($x,$y){
- $this->one=$x;
- $this->two=$y;
- echo "<font size=20px><strong>面向?qū)ο蟪绦蛟O(shè)計(jì)——接口</font></strong><hr>class test初始化:<br>屬性$one=".$this->one." 屬性$two=".$this->two."<hr>";
- }
- function display(js $a){
- return "<font color=#990000><b>用php接口技術(shù)實(shí)現(xiàn)的運(yùn)算——開始運(yùn)算啦:</b></font><hr>".$a->ys($this->one,$this->two)."<hr>";
- }
- }
- $t=new test(103,2);
- $t1=new jf;
- $t2=new china;
- echo $t->display($t1);
- echo $t->display($t2);
- ?>
好處:在小項(xiàng)目中,是體驗(yàn)不到的,使用接口編程,易于程序擴(kuò)展,降低程序耦合性.
舉個(gè)常用的例子說吧,你有個(gè)方法為:public viod doxx(arraylist arraylist),方法調(diào)用時(shí),參數(shù)必須為arraylist對(duì)象,某天,當(dāng)參數(shù)需要更換為其他集合類時(shí),必須更改代碼,此時(shí)如果用接口的話,就不須了,將方法更改為public viod doxx(list list),方法調(diào)用時(shí),參數(shù)就很靈活了,可以傳入arraylist、linkedlist等等,這樣從而降點(diǎn)耦合了.
新聞熱點(diǎn)
疑難解答