日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

增強一個類功能三個方法

作者:最好的期待,未來可期 更新時間: 2022-04-09 編程語言
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();
}
====================================================
  //2.裝飾類和被裝飾類要有共同的父親.
public class SuperMan implements Person{
   // 3.裝飾類必須持有被裝飾類的對象.
    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 {
//        1.需要裝飾類.
//        2.裝飾類和被裝飾類要有共同的父親.
//        3.裝飾類必須持有被裝飾類的對象.
//        FileInputStream fis = new FileInputStream("a.txt");//被裝飾類
//        BufferedInputStream bis = new BufferedInputStream(fis);//fis當做對象傳入了BufferedInputStream類中.
        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();
        //動態把man變成superman
        /**
         * 參數1: man.getClass().getClassLoader()  被代理對象的字節碼文件所屬的類加載器
         * 參數2:  man.getClass().getInterfaces()  被代理對象所實現的所有接口
         * 參數3: new InvocationHandler(){}        監聽代理對象調用方法的監聽器.
         */
        //superMan 是newProxyInstance()方法的返回值.返回的是代理對象.
        Person superMan = (Person) Proxy.newProxyInstance(man.getClass().getClassLoader(), man.getClass().getInterfaces(), new InvocationHandler() {

            /**
             * @param proxy   代理對象
             * @param method  代理對象正在執行的方法對象
             * @param args    代理對象調用方法時傳入的參數
             * 注意: InvocationHandler中的invoke()方法會在代理對象代用任何方法的時候都會執行.
             *      執行時會自動給你傳入三個參數:
             *                   * @param proxy   代理對象
             *                   * @param method  代理對象正在執行的方法對象
             *                  * @param args    代理對象調用方法時傳入的參數
             */
            @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();
    }
}
動態代理需要有接口

原文鏈接:https://blog.csdn.net/qq_37823919/article/details/122180411

欄目分類
最近更新