2017年3月24日 星期五

在不修改原有類的情況下去更改其method

假設已有Dog interface與Hound class
interface Dog{
  void bark();
}

public class Hound implements Dog{
  public void bark(){
     System.out.println("Hound Bark");
  }
}

繼承的方式修改bark()
public class BigHound extends Hound{
   @Override
   public void bark(){
      System.out.println("Big Hound Bark");
   }
}

裝飾者模式修改bark()
public class SmallDog implements Dog{
   private Dog dog;
   public SmallDog(Dog dog) {
       this.dog = dog;
   }

   @Override
   public void bark(){
      System.out.println("Small Dog");
      dog.bark();
   }  
}

動態代理模式
final Dog dog = new Hound();
Dog proxyDog = (Dog)Proxy.newProxyInstance(
                                             dog.getClass().getClassLoader(),
                                             dog.getClass().getInterface(),
                                             new InvocationHandler(){
                                                 public Object invoke(Object proxy, Method method, Object[] args)
                                                            throws Throwable {
                                                     if("run".equals(method.getName())) {
                                                         System.out.println("Proxy Dog");
                                                         return null;
                                                     }
                                                 }
                                             }
);

沒有留言:

張貼留言