1.继承
class Cat {
public void eat() {
System.out.println("爱吃鱼");
}
}
class LuckCat extends Cat {
public void eat() {
System.out.println("爱吃菜");
}
}
应用场景:已有现成的类,需要宽展或修改其功能。
优点:只需要重写需要改造的方法。 缺点:(1)杀鸡焉用宰牛刀,如果只重写一小部分功能就新建了一个类,性价比太低。(2)无法再继承其他类
2.装饰--接口
interface Cat {
void eat() ;
void sleep();
}
class LuckCat implements Cat {
private Cat cat = null;
public LuckCat(Cat c) {
cat = c;
}
public void eat() {
System.out.println("爱吃菜");
}
public void sleep() {
cat.sleep();
}
}
应用场景:新写的类与原来的类有一个共同的接口模板,且接口中方法比较少。
优点:不需要继承类,直接继承接口模板 缺点: 如果接口里方法太多,则重写方法太麻烦。
3.动态代理--对象
interface Cat{
void eat();
void sleep();
}
class LuckCat implements Cat{
public void eat() {
System.out.println("爱吃鱼");
}
public void sleep() {
System.out.println("白天睡觉");
}
public static void main(String[] args) {
final LuckCat luckCat = new LuckCat();
Cat proxy = (Cat) Proxy.newProxyInstance(LuckCat.class.getClassLoader(),LuckCat.class.getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if("eat".equals(method.getName())) {
System.out.println("爱吃菜");
return null;
}
else {
return method.invoke(luckCat, args);
}
}
});
proxy.eat();
}
}
应用场景:只需要改造一小部分功能,不想建新类,且原来的类继承的接口模板中方法太多。
优点:改造的是对象,灵活代价小。 缺点:实现原理比较难理解。