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

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

增強(qiáng)一個(gè)類(lèi)功能三個(gè)方法

作者:最好的期待,未來(lái)可期 更新時(shí)間: 2022-04-09 編程語(yǔ)言
1=繼承這個(gè)類(lèi)通過(guò)子類(lèi)重寫(xiě)的方式增強(qiáng)

2=使用裝飾者模式
簡(jiǎn)介:裝飾者模式是java23種設(shè)計(jì)模式之一,
裝飾模式是在不必改變?cè)?lèi)文件和使用繼承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。
它是通過(guò)創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾來(lái)包裹真實(shí)的對(duì)象
改變了傳統(tǒng)繼承增強(qiáng)對(duì)象功能所帶來(lái)的弊端.
使用前提:
    1.需要裝飾類(lèi).
    2.裝飾類(lèi)和被裝飾類(lèi)要有共同的父親.
    3.裝飾類(lèi)必須持有被裝飾類(lèi)的對(duì)象.
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("學(xué)java");
    }
    @Override
    public void run() {
        System.out.println("每小時(shí)5公里");
    }
}
===================================================
public interface Person {
    public void eat();
    public void sleep();
    public void study();
    public void run();
}
====================================================
  //2.裝飾類(lèi)和被裝飾類(lèi)要有共同的父親.
public class SuperMan implements Person{
   // 3.裝飾類(lèi)必須持有被裝飾類(lèi)的對(duì)象.
    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("每小時(shí)10公里");
    }
}
================================================
public class TestPerson {
    public static void main(String[] args) throws FileNotFoundException {
//        1.需要裝飾類(lèi).
//        2.裝飾類(lèi)和被裝飾類(lèi)要有共同的父親.
//        3.裝飾類(lèi)必須持有被裝飾類(lèi)的對(duì)象.
//        FileInputStream fis = new FileInputStream("a.txt");//被裝飾類(lèi)
//        BufferedInputStream bis = new BufferedInputStream(fis);//fis當(dāng)做對(duì)象傳入了BufferedInputStream類(lèi)中.
        Man m = new Man();
        SuperMan sm = new SuperMan(m);
        showMan(m);
        showMan(sm);
    }
    public  static  void showMan(Person p){
        p.eat();
        p.run();
    }
}
3=使用動(dòng)態(tài)代理模式
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("學(xué)java");
    }
    @Override
    public void run() {
        System.out.println("每小時(shí)5公里");
    }
}
===============================================
/**
 * 通過(guò)繼承是可以改變一個(gè)類(lèi)的方法運(yùn)行邏輯的.
 */
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();
        //動(dòng)態(tài)把man變成superman
        /**
         * 參數(shù)1: man.getClass().getClassLoader()  被代理對(duì)象的字節(jié)碼文件所屬的類(lèi)加載器
         * 參數(shù)2:  man.getClass().getInterfaces()  被代理對(duì)象所實(shí)現(xiàn)的所有接口
         * 參數(shù)3: new InvocationHandler(){}        監(jiān)聽(tīng)代理對(duì)象調(diào)用方法的監(jiān)聽(tīng)器.
         */
        //superMan 是newProxyInstance()方法的返回值.返回的是代理對(duì)象.
        Person superMan = (Person) Proxy.newProxyInstance(man.getClass().getClassLoader(), man.getClass().getInterfaces(), new InvocationHandler() {

            /**
             * @param proxy   代理對(duì)象
             * @param method  代理對(duì)象正在執(zhí)行的方法對(duì)象
             * @param args    代理對(duì)象調(diào)用方法時(shí)傳入的參數(shù)
             * 注意: InvocationHandler中的invoke()方法會(huì)在代理對(duì)象代用任何方法的時(shí)候都會(huì)執(zhí)行.
             *      執(zhí)行時(shí)會(huì)自動(dòng)給你傳入三個(gè)參數(shù):
             *                   * @param proxy   代理對(duì)象
             *                   * @param method  代理對(duì)象正在執(zhí)行的方法對(duì)象
             *                  * @param args    代理對(duì)象調(diào)用方法時(shí)傳入的參數(shù)
             */
            @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("每小時(shí)10公里");
                    return  null;
                }else{
                    return method.invoke(man,args);//不關(guān)心的方法.正常執(zhí)行
                }
            }
        });
        showMan(superMan);
    }
    public  static  void showMan(Person p){
        p.eat();
        p.sleep();
        p.run();
    }
}
動(dòng)態(tài)代理需要有接口

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

欄目分類(lèi)
最近更新