1=继承这个类通过子类重写的方式增强
2=使用装饰者模式
简介:装饰者模式是java23种设计模式之一,
装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。
它是通过创建一个包装对象,也就是装饰来包裹真实的对象
改变了传统继承增强对象功能所带来的弊端.
使用前提:
1.需要装饰类.
2.装饰类和被装饰类要有共同的父亲.
3.装饰类必须持有被装饰类的对象.
public class Man implements Person {
@Override
public void eat() {
System.out.println("吃山珍海味");
}
@Override
public void sleep() {
System.out.println("睡大街");
}
@Override
public void study() {
System.out.println("学java");
}
@Override
public void run() {
System.out.println("每小时5公里");
}
}
===================================================
public interface Person {
public void eat();
public void sleep();
public void study();
public void run();
}
====================================================
public class SuperMan implements Person{
Man man ;
public SuperMan( Man man ){
this.man = man;
}
@Override
public void eat() {
man.eat();
}
@Override
public void sleep() {
man.sleep();
}
@Override
public void study() {
man.study();
}
@Override
public void run() {
System.out.println("每小时10公里");
}
}
================================================
public class TestPerson {
public static void main(String[] args) throws FileNotFoundException {
Man m = new Man();
SuperMan sm = new SuperMan(m);
showMan(m);
showMan(sm);
}
public static void showMan(Person p){
p.eat();
p.run();
}
}
3=使用动态代理模式
public class Man implements Person {
@Override
public void eat() {
System.out.println("吃山珍海味");
}
@Override
public void sleep() {
System.out.println("睡大街");
}
@Override
public void study() {
System.out.println("学java");
}
@Override
public void run() {
System.out.println("每小时5公里");
}
}
===============================================
public interface Person {
public void eat();
public void sleep();
public void study();
public void run();
}
=======================================================
public class TestPerson {
public static void main(String[] args) throws FileNotFoundException {
Man man = new Man();
Person superMan = (Person) Proxy.newProxyInstance(man.getClass().getClassLoader(), man.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName()+"======================");
if(method.getName().equals("run")){
System.out.println("每小时10公里");
return null;
}else{
return method.invoke(man,args);
}
}
});
showMan(superMan);
}
public static void showMan(Person p){
p.eat();
p.sleep();
p.run();
}
}
动态代理需要有接口