REST API设计理念
Python Mixin模式
背景
民航飞机和直升机都是飞行器,又是交通工具,轿车也是交通工具,但是不会飞
可以多重继承,但这违背了继承必须是”is-a”关系
不同语言的实现方法
java
Java提供了接口interface功能,来实现多重继承
public adstract class Vehicle {
}
public interface Flyable {
public void fly();
}
public class FlyableImpl implements Flyable {
public void fly() {
System.out.printIn('I am flying');
}
}
public class Airplane extends Vehicle implements Flyable {
private flyable;
public Airplane() {
flyable = new FlyableImpl();
}
public void fly() {
flyable.fly();
}
}
现在我们的飞机同时具有了交通工具及飞行器两种属性,而且我们不需要重写飞行器中的飞行方法,同时我们没有破坏单一继承的原则。飞机就是一种交通工具,可飞行的能力是是飞机的属性,通过继承接口来获取
Python
Python语言可没有接口功能,但是它可以多重继承。那Python是不是就该用多重继承来实现呢?是,也不是。说是,因为从语法上看,的确是通过多重继承实现的。说不是,因为它的继承依然遵守”is-a”关系,从含义上看依然遵循单继承的原则
class Vehicle(object):
pass
class PlaneMixin(object):
def fly(self):
print('I am flying')
class Airplane(Vehicle, PlaneMixin)
pass
可以看到,上面的Airplane类实现了多继承,不过它继承的第二个类我们起名为PlaneMixin,而不是Plane,这个并不影响功能,但是会告诉后来读代码的人,这个类是一个Mixin类。所以从含义上理解,Airplane只是一个Vehicle,不是一个Plane。这个Mixin,表示混入(mix-in),它告诉别人,这个类是作为功能添加到子类中,而不是作为父类,它的作用同Java中的接口。
使用Mixin类实现多重继承要非常小心
- 首先它必须表示某一种功能,而不是某个物品,如同Java中的Runnable,Callable等
- 其次它必须责任单一,如果有多个功能,那就写多个Mixin类
- 然后,它不依赖于子类的实现
- 最后,子类即便没有继承这个Mixin类,也照样可以工作,就是缺少了某个功能。(比如飞机照样可以载客,就是不能飞了^_^)
ReactJS
var PlaneMixin = function() {
return {
fly: function() {
console.log('I am flying');
}
}
}
var AirplaneComponent = React.createClass({
mixins: [PlaneMixin()],
render: function() {
return 'what's mixin';
}
})