首页 > 代码库 > python\接口与归一化设计

python\接口与归一化设计

1接口

接口的概念:

Java 语言中的接口很好的展现了接口的含义: IAnimal.java

/*

* Java的Interface很好的体现了我们前面分析的接口的特征:

* 1)是一组功能的集合,而不是一个功能

* 2)接口的功能用于交互,所有的功能都是public,即别的对象可操作

* 3)接口只定义函数,但不涉及函数实现

* 4)这些功能是相关的,都是动物相关的功能,但光合作用就不适宜放到IAnimal里面了 */

 

package com.oo.demo;

public interface IAnimal {

    public void eat();

    public void run();

    public void sleep();

    public void speak();

}

 

=================第二部分:Pig.java:猪”的类设计,实现了IAnnimal接口

package com.oo.demo;

public class Pig implements IAnimal{ //如下每个函数都需要详细实现

    public void eat(){

        System.out.println("Pig like to eat grass");

    }

 

    public void run(){

        System.out.println("Pig run: front legs, back legs");

    }

 

    public void sleep(){

        System.out.println("Pig sleep 16 hours every day");

    }

 

    public void speak(){

        System.out.println("Pig can not speak"); }

}

 

=================第三部分:Person2.java

/*

*实现了IAnimal的“人”,有几点说明一下:

* 1)同样都实现了IAnimal的接口,但“人”和“猪”的实现不一样,为了避免太多代码导致影响阅读,这里的代码简化成一行,但输出的内容不一样,实际项目中同一接口的同一功能点,不同的类实现完全不一样

* 2)这里同样是“人”这个类,但和前面介绍类时给的类“Person”完全不一样,这是因为同样的逻辑概念,在不同的应用场景下,具备的属性和功能是完全不一样的 */

 

package com.oo.demo;

public class Person2 implements IAnimal {

    public void eat(){

        System.out.println("Person like to eat meat");

    }

 

    public void run(){

        System.out.println("Person run: left leg, right leg");

    }

 

    public void sleep(){

        System.out.println("Person sleep 8 hours every dat");

    }

 

    public void speak(){

        System.out.println("Hellow world, I am a person");

    }

}

 

=================第四部分:Tester03.java

package com.oo.demo;

 

public class Tester03 {

    public static void main(String[] args) {

        System.out.println("===This is a person===");

        IAnimal person = new Person2();

        person.eat();

        person.run();

        person.sleep();

        person.speak();

       

        System.out.println("\n===This is a pig===");

        IAnimal pig = new Pig();

        pig.eat();

        pig.run();

        pig.sleep();

        pig.speak();

    }

}

 

继承有两种用途:

 

一:继承基类的方法,并且做出自己的改变或者扩展(代码重用)

 

二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能

 

class Interface:#定义接口Interface类来模仿接口的概念,python中压根就没有interface关键字来定义一个接口。

    def read(self): #定接口函数read

        pass

 

    def write(self): #定义接口函数write

        pass

 

 

class Txt(Interface): #文本,具体实现read和write

    def read(self):

        print(‘文本数据的读取方法‘)

 

    def write(self):

        print(‘文本数据的读取方法‘)

 

class Sata(Interface): #磁盘,具体实现read和write

    def read(self):

        print(‘硬盘数据的读取方法‘)

 

    def write(self):

        print(‘硬盘数据的读取方法‘)

 

class Process(All_file):

    def read(self):

        print(‘进程数据的读取方法‘)

 

    def write(self):

        print(‘进程数据的读取方法‘)

 

实践中,继承的第一种含义意义并不很大,甚至常常是有害的。因为它使得子类与基类出现强耦合。

继承的第二种含义非常重要。它又叫“接口继承”。

接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。

归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合——就好象linux的泛文件概念一样,所有东西都可以当文件处理,不必关心它是内存、磁盘、网络还是屏幕(当然,对底层设计者,当然也可以区分出“字符设备”和“块设备”,然后做出针对性的设计:细致到什么程度,视需求而定)。

在python中根本就没有一个叫做interface的关键字,上面的代码只是看起来像接口,其实并没有起到接口的作用,子类完全可以不用去实现接口 ,如果非要去模仿接口的概念,可以借助第三方模块。

1.1为什么要用接口

接口提取了一群类共同的函数,可以把接口当做一个函数的集合。

然后让子类去实现接口中的函数

这么做的意义在于归一化,什么叫归一化,就是只要是基于同一个接口实现的类,那么所有的这些类产生的对象在使用时,从用法上来说都一样。

归一化,让使用者无需关心对象的类是什么,只需要的知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度。

 

比如:我们定义一个动物接口,接口里定义了有跑、吃、呼吸等接口函数,这样老鼠的类去实现了该接口,松鼠的类也去实现了该接口,由二者分别产生一只老鼠和一只松鼠送到你面前,即便是你分别不到底哪只是什么鼠你肯定知道他俩都会跑,都会吃,都能呼吸。

 

比如:我们有一个汽车接口,里面定义了汽车所有的功能,然后由本田汽车的类,奥迪汽车的类,大众汽车的类,他们都实现了汽车接口,这样就好办了,大家只需要学会了怎么开汽车,那么无论是本田,还是奥迪,还是大众我们都会开了,开的时候根本无需关心我开的是哪一类车,操作手法(函数调用)都一样

 

python\接口与归一化设计