1. 程式人生 > 其它 >什麼是網際網路控制訊息協議ICMP 以及如何作為網路分析利器

什麼是網際網路控制訊息協議ICMP 以及如何作為網路分析利器

目錄

例項

資料加密

假設一個數據加密的應用場景,可以對字串進行加密,使用者先使用最簡單的加密演算法對字串進行加密,如果覺得不夠,可以對加密後的結果使用MD5AESRSA等加密演算法進行二次加密


解決方案

  • Encrypt.java
/**
 * @Description 加密
 */
public class Encrypt {
    public String encrypt(String str) {
        return str + " 常規加密";
    }
}
  • AESEncrypt.java
/**
 * @Description AES加密
 */
public class AESEncrypt extends Encrypt {
    @Override
    public String encrypt(String str) {
        return super.encrypt(str) + " AES加密";
    }
}
  • MD5Encrypt.java
/**
 * @Description MD5加密
 */
public class MD5Encrypt extends Encrypt {
    @Override
    public String encrypt(String str) {
        return super.encrypt(str) + " MD5加密";
    }
}
  • RSAEncrypt.java
/**
 * @Description RSA加密
 */
public class RSAEncrypt extends Encrypt {
    @Override
    public String encrypt(String str) {
        return super.encrypt(str) + " RSA加密";
    }
}
  • Test.java
/**
 * @Description 測試類
 */
public class Test {

    public static void main(String[] args) {
        Encrypt encrypt = new Encrypt();
        System.out.println(encrypt.encrypt("encrypt data"));

        MD5Encrypt md5Encrypt = new MD5Encrypt();
        System.out.println(md5Encrypt.encrypt("encrypt data"));

        AESEncrypt aesEncrypt = new AESEncrypt();
        System.out.println(aesEncrypt.encrypt("encrypt data"));

        RSAEncrypt rsaEncrypt = new RSAEncrypt();
        System.out.println(rsaEncrypt.encrypt("encrypt data"));
    }

}
  • 輸出如下:
encrypt data 常規加密
encrypt data 常規加密 MD5加密
encrypt data 常規加密 AES加密
encrypt data 常規加密 RSA加密
  • 類圖如下:

需求變更

  • 滿足如上業務場景後,使用者需求變更,需要進行3次或多次加密,可以看出,如上程式碼對於使用者想要進行多次加密的行為無法實現,接下來引出裝飾模式

  • 裝飾模式用於擴充套件系統功能,其可以在不改變一個物件本身功能的基礎上給物件增加額外的新行為


裝飾模式

概念

  • 裝飾模式(Decorator Pattern):動態地給一個物件增加一些額外的職責
  • 裝飾模式提供了比繼承更有彈性的替代方案(擴充套件原有物件功能)
  • 裝飾模式是一種物件結構型模式
  • 裝飾模式結構圖(來自劉偉老師技術部落格)
  • 裝飾模式角色定義:
角色 名稱 釋義
Component 抽象構件 具體構件和抽象裝飾類的共同父類,聲明瞭在具體構件中實現的業務方法
ConcreteComponent 具體構件 抽象構件類的子類,用於定義具體的構件物件,實現了在抽象構件中宣告的方法,裝飾器可以給它增加額外的職責(方法)
Decorator 抽象裝飾類 抽象構件類的子類,用於給具體構件增加職責,但是具體職責在其子類中實現。它維護一個指向抽象構件物件的引用,通過該引用可以呼叫裝飾之前構件物件的方法,並通過其子類擴充套件該方法,以達到裝飾的目的
ConcreteDecorator 具體裝飾類 抽象裝飾類的子類,負責向構件新增新的職責。每一個具體裝飾類都定義了一些新的行為,它可以呼叫在抽象裝飾類中定義的方法,並可以增加新的方法用以擴充物件的行為

  • 裝飾模式是一種用於替代繼承的技術,它通過一種無需定義子類的方式來給物件動態增加職責,使用物件之間的關聯關係取代類之間的繼承關係

裝飾模式解決方案

  • AEncrypt.java
/**
 * @Description 抽象加密構建類
 */
public abstract class AEncrypt {

    /**
     * 加密
     * @param str
     * @return
     */
    public abstract String encrypt(String str);

}
  • CommonEncrypt.java
/**
 * @Description 常規加密具體構建類
 */
public class CommonEncrypt extends AEncrypt {
    @Override
    public String encrypt(String str) {
        return str + " 常規加密";
    }
}
  • EncryptDecorator.java
/**
 * @Description 抽象構建裝飾類
 */
public abstract class EncryptDecorator extends AEncrypt {

    // TODO 維持一個對抽象構件物件的引用
    private AEncrypt aEncrypt;

    // TODO 注入一個抽象構件型別的物件
    public EncryptDecorator(AEncrypt aEncrypt) {
        this.aEncrypt = aEncrypt;
    }

    @Override
    public String encrypt(String str) {
        // TODO 呼叫原有業務方法
        return aEncrypt.encrypt(str);
    }
}
  • AESDecorator.java
/**
 * @Description AES加密具體裝飾類
 */
public class AESDecorator extends EncryptDecorator {

    public AESDecorator(AEncrypt aEncrypt) {
        super(aEncrypt);
    }

    @Override
    public String encrypt(String str) {
        // TODO 呼叫原有業務方法 + 擴充套件新功能
        return super.encrypt(str) + " AES加密";
    }
}
  • MD5Decorator.java
/**
 * @Description MD5加密具體裝飾類
 */
public class MD5Decorator extends EncryptDecorator {

    public MD5Decorator(AEncrypt aEncrypt) {
        super(aEncrypt);
    }

    @Override
    public String encrypt(String str) {
    	// TODO 呼叫原有業務方法 + 擴充套件新功能
        return super.encrypt(str) + " MD5加密";
    }
}
  • RSADecorator.java
/**
 * @Description RSA加密具體裝飾類
 */
public class RSADecorator extends EncryptDecorator {

    public RSADecorator(AEncrypt aEncrypt) {
        super(aEncrypt);
    }

    @Override
    public String encrypt(String str) {
    	// TODO 呼叫原有業務方法 + 擴充套件新功能
        return super.encrypt(str) + " RSA加密";
    }
}
  • Test.java
/**
 * @Description 裝飾模式測試類
 */
public class Test {

    public static void main(String[] args) {
        /**
         * 常規加密
         */
        AEncrypt aEncrypt = new CommonEncrypt();
        System.out.println(aEncrypt.encrypt("encrypt data"));

        /**
         * MD5加密
         */
        aEncrypt = new MD5Decorator(aEncrypt);
        System.out.println(aEncrypt.encrypt("encrypt data"));

        /**
         * RSA加密
         */
        aEncrypt = new RSADecorator(aEncrypt);
        System.out.println(aEncrypt.encrypt("encrypt data"));

        /**
         * AES加密
         */
        aEncrypt = new AESDecorator(aEncrypt);
        System.out.println(aEncrypt.encrypt("encrypt data"));
    }

}
  • 輸出如下:
encrypt data 常規加密
encrypt data 常規加密 MD5加密
encrypt data 常規加密 MD5加密 RSA加密
encrypt data 常規加密 MD5加密 RSA加密 AES加密
  • 類圖如下:

總結

  • 優點
1.繼承的有力補充,比繼承靈活,不改變原有物件的情況下給一個物件擴充套件功能
2.通過使用不同裝飾類以及這些裝飾類的排列組合可以實現不同的效果
3.符合開閉原則
  • 缺點
1.會出現更多的程式碼,更多的類,增加程式複雜性
2.動態裝飾時,多層裝飾時會更復雜
  • 適用場景
1.擴充套件一個類的功能或給一個類新增附加職責
2.動態的給一個物件新增功能,這些功能可以再動態的撤銷
  • 裝飾模式原始碼
BufferedReader(java.io)、BufferedInputStream、BufferedOutputStream、Cache(Mybatis)

原始碼


- End -
- 個人學習筆記 -
- 僅供參考 -