接口的另一种实现方式

220 阅读1分钟

接口的实现方式,一般都是通过implements方式,直接重写接口的方法即可,今天给大家介绍另一种方式---代理,来实现接口,首先创建一个接口

public interface AnimationInterface {

    void start();
    void stop();
}

声明了两个方法start和stop,然后就是通过代理的方式,来实现这个接口,代码如下


public class MainActivity extends AppCompatActivity implements InvocationHandler {

    private AnimationInterface mAniamationInterface;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mAniamationInterface = (AnimationInterface) Proxy.newProxyInstance(AnimationInterface.class.getClassLoader(), new Class[]{AnimationInterface.class}, this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Method m = getClass().getDeclaredMethod(method.getName(), method.getParameterTypes());
        return m.invoke(this, args);
    }

    public void stop() {
        Log.d("dyj", "stop");
    }

    public void start() {
        Log.d("dyj", "start");
    }

    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.start:
                mAniamationInterface.start();
                break;
            case R.id.stop:
                mAniamationInterface.stop();
                break;
            default:
                Log.d("dyj", "default");
        }
    }
}

因为需要通过代理来实现,所以MainActivity需要实现InvocationHandler这个接口并实现AnimationInterface里面的方法(这里的实现不是通过implements实现的),最后通过Proxy.newProxyInstance拿到代理对象就可以了。然后通过代理对象即可调用接口的方法(即MainActivity中的实现)。

这种方式可以满足一些非常规的需求,比如要实现的某个接口,不在同一个app中,此时就可以通过这种方式来实现。

demo地址:https://github.com/dyjAndroid/ProxyDemo