改变不喜欢的方法。
一、继承
二、装饰
1、使原来的类实现某个接口,接口中定义该类中的抽象方法;
2、定义一个装饰类,实现之前的那个接口,并具体实现之前那个类中不喜欢的方法。
Demo:
定义一个Person接口:
package app.java.study;
public interface Person {
public void eat();
public void run();
}
已有Student类:
package app.java.study;
public class Student implements Person{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public void eat(){
System.out.println("student is eating......zzzz");
}
public void run(){
System.out.println("student is running fast");
}
}
但是,student中的eat()并不是我们希望要的,我们希望改造他,定义一个Worker装饰该Student:
package app.java.study;
public class Worker implements Person{
private Person person = null;
public Worker(Person person){
this.person = person;
}
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("Workers are eating happily!");
}
@Override
public void run() {
// TODO Auto-generated method stub
person.run();
}
}
输出:
Workers are eating happily!
student is running fast
这样就能达到一个装饰的效果。
三、动态代理
package app.java.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import app.java.study.Person;
import app.java.study.Student;
public class Docter {
public static void main(String[] args){
final Student student = new Student();
Person proxy = (Person) Proxy.newProxyInstance(Student.class.getClassLoader(), Student.class.getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
if("eat".equals(method.getName())){
System.out.println("Doctor is vary busy,no time to eat!!!");
return null;
}else{
return method.invoke(student, args);
}
}
});
proxy.eat();
proxy.run();
}
}
输出:
Doctor is vary busy,no time to eat!!!
student is running fast
注意点:1、final Student student = new Student();
代理类需要一个不会变化的对象。