2011年12月30日星期五

第9天第5节: 抽象类、接口的实际作用





1. abstract vs interface


2. 模板设计方法(抽象类)
父类为抽象类:定义若干抽象方法,定义一个正常的模板方法,该模板方法调用抽象方法返回值
子类为正常类:实现抽象方法并放回值
主函数类: 创建子类并调用抽象类的模板方法
适合地方: Web开发
abstract class Product
{
    public abstract String getName();
    public abstract float getPrice();
    public String getInfo() {
        return "Name: " + this.getName() + "Price: " + this.getPrice();
    }
}

class Dog extends Product
{   
    public String getName() {
        return "dog";
    }
    public float getPrice() {
        return 15.0f;
    }
}

class Cat extends Product
{   
    public String getName() {
        return "cat";
    }
    public float getPrice() {
        return 25.0f;
    }
}

public class testb
{
    public static void main ( String args[] ) {
        Product d = new Dog();
        Product c = new Cat();
        System.out.println(d.getInfo());
        System.out.println(c.getInfo());
    }
}

---------- java ----------
Name: dogPrice: 15.0
Name: catPrice: 25.0

2. 制定标准设计方法(接口类)
父类为接口类:定义若干抽象方法
子类为正常类:实现抽象方法
第三方类: 定义正常方法,该方法使用接口类参数
主函数类: 创建第三方类,并多次调用第三方类的方法,每次调用给以不用的子类为参数

适合地方:接口标准的制定,例如USB标准 interface usb
{
    void start();
    void end();
}

class printer implements usb
{
    public void start () {
        System.out.println("printer starts");
    }
    public void end () {
        System.out.println("printer ends");
    }
}

class flash implements usb
{
    public void start () {
        System.out.println("flash starts");
    }
    public void end () {
        System.out.println("flash ends");
    }
}

class computer
{
    void plugin(usb u) {
        u.start();
        u.end();
    }
}

public class testb
{
    public static void main ( String args[] ) {
        computer com = new computer();
        com.plugin(new flash());
        com.plugin(new printer());
    }
}
---------- java ----------
flash starts
flash ends
printer starts
printer ends


2.工厂设计模式

父类为接口类:定义若干抽象方法
子类为正常类:实现抽象方法
工厂类: 定义正常方法,该方法根据String类常数放回所创建的子对象的接口类句柄

主函数类: 从工厂获得子对象,并调用该子对象的抽象方法

适合地方:Java开发常用,客户只需了解接口和产品信息描述即可
 interface usb
{
    void start();
    void end();
}

class printer implements usb
{
    public void start () {
        System.out.println("printer starts");
    }
    public void end () {
        System.out.println("printer ends");
    }
}

class flash implements usb
{
    public void start () {
        System.out.println("flash starts");
    }
    public void end () {
        System.out.println("flash ends");
    }
}

class factory
{
    public usb getInstance(String name) {
        usb f=null;
        if ( name.equals("flash")) {
            f = new flash();
        }else if ( name.equals("printer"))
        {
            f = new printer();
        }
        return f;
    }
}

public class testb
{
    public static void main ( String args[] ) {
        factory fac = new factory();
        usb f = fac.getInstance("printer");
        f.start();
        f.end();
    }
}
---------- java ----------
printer starts
printer ends

==代理设计模式
 设计模式中定义: 为其他对象提供一种代理以控制对这个对象的访问.

为什么要使用Proxy?
1.授权机制 不同级别的用户对同一对象拥有不同的访问权利
2.某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动.
(1)如果那个对象是一个是很大的图片,需要花费很长时间才能显示出来,那么当这个图片包含在文档中时,使用编辑器或浏览器打开这个文档,打开文档必须很迅速,不能等待大图片处理完成,这时需要做个图片Proxy来代替真正的图片.
(2)如果那个对象在Internet的某个远端服务器上,直接操作这个对象因为网络速度原因可能比较慢,那我们可以先用Proxy来代替那个对象.

==适配器设计模式
接口类: 定义了所有可能要在子类中出现的抽象方法
抽象类: dummy实现了所有接口类的方法
子类:extends抽象类并真正实现它自己说关心的方法

没有评论: