{"id":1070,"date":"2019-09-27T16:08:59","date_gmt":"2019-09-27T08:08:59","guid":{"rendered":"http:\/\/www.rain1024.com\/?p=1070"},"modified":"2023-08-07T20:57:25","modified_gmt":"2023-08-07T12:57:25","slug":"%e3%80%8aheadfirst%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e3%80%8b%e7%ac%ac%e4%ba%8c%e7%ab%a0%e8%a7%82%e5%af%9f%e8%80%85%e6%a8%a1%e5%bc%8f-%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0","status":"publish","type":"post","link":"http:\/\/rain1024.com\/index.php\/2019\/09\/27\/%e3%80%8aheadfirst%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e3%80%8b%e7%ac%ac%e4%ba%8c%e7%ab%a0%e8%a7%82%e5%af%9f%e8%80%85%e6%a8%a1%e5%bc%8f-%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0\/","title":{"rendered":"\u300aHeadFirst\u8bbe\u8ba1\u6a21\u5f0f\u300b\u7b2c\u4e8c\u7ae0\u89c2\u5bdf\u8005\u6a21\u5f0f-\u8bfb\u4e66\u7b14\u8bb0"},"content":{"rendered":"<h1>\u300aHeadFirst\u8bbe\u8ba1\u6a21\u5f0f\u300b\u7b2c\u4e8c\u7ae0\u89c2\u5bdf\u8005\u6a21\u5f0f-\u8bfb\u4e66\u7b14\u8bb0<\/h1>\n<h3>\u6848\u4f8b\u4ee3\u7801\u94fe\u63a5\uff1ahttps:\/\/github.com\/rainweb521\/My-tutorial\/tree\/master\/Design_patterns<\/h3>\n<h2>1. \u80cc\u666f<\/h2>\n<blockquote><p>\n  \u8fd9\u6b21\u7684\u5f15\u5b50\u662f\u5173\u4e8e\u6c14\u8c61\u7ad9\u7684\u5e94\u7528\uff0c\u6848\u4f8b\u4e2d\u8981\u5efa\u7acb\u4e00\u4e2a\u5e94\u7528\uff0c\u6709\u4e09\u79cd\u5929\u6c14\u9884\u62a5\u7684\u5c55\u73b0\u5f62\u5f0f\uff0c\u4f7f\u7528\u4e00\u4e2aWeatherObject\u5bf9\u8c61\u83b7\u5f97\u6700\u65b0\u6d4b\u91cf\u5230\u7684\u5929\u6c14\u6570\u636e\uff0c\u7136\u540e\u5bf9\u4e09\u4e2a\u5e03\u544a\u677f\u8fdb\u884c\u5b9e\u65f6\u66f4\u65b0\u3002\u5e76\u4e14\u4ee5\u540e\u53ef\u80fd\u4f1a\u65b0\u52a0\u5165\u5176\u4ed6\u7684\u5e03\u544a\u677f\uff0c\u9700\u8981\u7cfb\u7edf\u6709\u5f88\u9ad8\u7684\u6269\u5c55\u6027\u3002WeatherData\u5bf9\u8c61\u77e5\u9053\u5982\u4f55\u8ddf\u7269\u7406\u6c14\u8c61\u7ad9\u8054\u7cfb,\u4ee5\u53d6\u5f97\u66f4\u65b0\u7684\u6570\u636e\u3002WeatherData\u5bf9\u8c61\u4f1a\u968f\u5373\u66f4\u65b0\u4e09\u4e2a\u5e03\u544a\u677f\u7684\u663e\u793a:\u76ee\u524d\u72b6\u51b5(\u6e29\u5ea6\u3001\u6e7f\u5ea6\u3001\u6c14\u538b)\u3001\u6c14\u8c61\u7edf\u8ba1\u548c\u5929\u6c14\u9884\u62a5\u3002\n<\/p><\/blockquote>\n<p><img decoding=\"async\" src=\"http:\/\/cos.rain1024.com\/markdown\/image-20190924201516474.png\"\/><\/p>\n<p><strong>\u8fd9\u662fWeatherData\u7c7b<\/strong><\/p>\n<pre><code>WeatherData\ngetTemperature( )\ngetHumidity( ) \ngetPressure( ) \nmeasure- mentsChanged( )\n\n\/*  \n* \u4e00\u65e6\u6c14\u8c61\u6d4b\u91cf\u66f4\u65b0,\u6b64\u65b9\u6cd5\u4f1a\u88ab\u8c03\u7528 \n*\/\npublic void measurementsChanged() {\n\/\/ \u4f60\u7684\u4ee3\u7801\u52a0\u5728\u8fd9\u91cc\n}\n<\/code><\/pre>\n<h2>2. \u9700\u6c42\u5206\u6790<\/h2>\n<h4>2.1 WeatherData\u7c7b\u5177\u6709getter\u65b9\u6cd5,\u53ef\u4ee5\u53d6\u5f97\u4e09\u4e2a\u6d4b\u91cf\u503c:\u6e29\u5ea6\u3001\u6e7f\u5ea6\u4e0e\u6c14\u538b\u3002<\/h4>\n<h4>2.2 \u5f53\u65b0\u7684\u6d4b\u91cf\u6570\u636e\u5907\u59a5\u65f6,measurementsChanged()\u65b9\u6cd5\u5c31\u4f1a\u88ab\u8c03\u7528(\u6211\u4eec\u4e0d\u5728\u4e4e\u6b64\u65b9\u6cd5\u662f\u5982\u4f55\u88ab\u8c03\u7528\u7684,\u6211\u4eec\u53ea\u5728\u4e4e\u5b83\u88ab\u8c03\u7528\u4e86)\u3002<\/h4>\n<h4>2.3 \u6211\u4eec\u9700\u8981\u5b9e\u73b0\u4e09\u4e2a\u4f7f\u7528\u5929\u6c14\u6570\u636e\u7684\u5e03\u544a\u677f:\u201c\u76ee\u524d\u72b6\u51b5\u201d\u5e03\u544a\u3001\u201c\u6c14\u8c61\u7edf\u8ba1\u201d\u5e03\u544a\u3001\u201c\u5929\u6c14\u9884\u62a5\u201d\u5e03\u544a\u3002\u4e00\u65e6WeatherData\u6709\u65b0\u7684\u6d4b\u91cf,\u8fd9\u4e9b\u5e03\u544a\u5fc5\u987b\u9a6c\u4e0a\u66f4\u65b0\u3002<\/h4>\n<h4>2.4 \u6b64\u7cfb\u7edf\u5fc5\u987b\u53ef\u6269\u5c55,\u8ba9\u5176\u4ed6\u5f00\u53d1\u4eba\u5458\u5efa\u7acb\u5b9a\u5236\u7684\u5e03\u544a\u677f, \u7528\u6237\u53ef\u4ee5\u968f\u5fc3\u6240\u6b32\u5730\u6dfb\u52a0\u6216\u5220\u9664\u4efb\u4f55\u5e03\u544a\u677f\u3002\u76ee\u524d\u521d\u59cb\u7684\u5e03\u544a\u677f\u6709\u4e09\u7c7b:\u201c\u76ee\u524d\u72b6\u51b5\u201d\u5e03\u544a\u3001\u201c\u6c14\u8c61\u7edf\u8ba1\u201d\u5e03\u544a\u3001\u201c\u5929\u6c14\u9884\u62a5\u201d\u5e03\u544a\u3002<\/h4>\n<h2>3.\u5f00\u59cb\u5e72\u6d3b<\/h2>\n<h3>3.1 \u5148\u6765\u8bd5\u4e00\u4e0b<\/h3>\n<pre><code>public class WeatherData {\n\/\/ \u5b9e\u4f8b\u53d8\u91cf\u58f0\u660e    \npublic void measurementsChanged() {         \n  float temp = getTemperature();         \n  float humidity = getHumidity();         \n  float pressure = getPressure();         \n  currentConditionsDisplay.update(temp, humidity, pressure);         \n  statisticsDisplay.update(temp, humidity, pressure);         \n  forecastDisplay.update(temp, humidity, pressure);     \n}     \n\/\/ \u8fd9\u91cc\u662f\u5176\u4ed6WeatherData\u65b9\u6cd5}\n<\/code><\/pre>\n<p>\u8fd9\u662f\u6700\u7b80\u5355\u7684\u5b9e\u73b0\u529e\u6cd5\uff0c\u5f88\u5feb\u5c31\u53ef\u4ee5\u5c06\u6570\u636e\u5b8c\u6210\u66f4\u65b0\uff0c\u4f46\u662f\u5982\u679c\u4ece\u5f00\u53d1\u539f\u5219\u4e0a\u8003\u8651\uff0c\u8fd9\u6837\u7684\u4ee3\u7801\u592a\u8fc7\u4e8e\u7c97\u7cd9\uff0c\u4e09\u4e2aupdate\u65b9\u6cd5\u867d\u7136\u4e0d\u591a\uff0c\u4f46\u5982\u679c\u540e\u671f\u518d\u589e\u52a0\u5e03\u544a\u677f\uff0cupdate\u65b9\u6cd5\u7684\u8c03\u7528\u5c06\u4f1a\u4e00\u76f4\u589e\u52a0\uff0c\u4e0d\u8bba\u589e\u52a0\u8fd8\u662f\u5220\u9664\u5e03\u544a\u677f\u90fd\u4f1a\u4fee\u6539\u7a0b\u5e8f\u3002<\/p>\n<p>\u8fd9\u6bb5\u7a0b\u5e8f\u5c31\u662f\u9488\u5bf9\u5177\u4f53\u5b9e\u73b0\u7f16\u7a0b\uff0c\u800c\u4e0d\u662f\u9488\u5bf9\u63a5\u53e3\u7f16\u7a0b\uff0c\u6211\u4eec\u9700\u8981\u5c06\u76f8\u4f3c\u7684\u5730\u65b9\u5c01\u88c5\u8d77\u6765\u3002<\/p>\n<h2>4.\u5f00\u59cb\u6211\u4eec\u7684\u89c2\u5bdf\u8005\u6a21\u5f0f<\/h2>\n<h3>4.1 \u8ba4\u8bc6\u89c2\u5bdf\u8005\u6a21\u5f0f<\/h3>\n<p>\u6211\u4eec\u770b\u770b\u62a5\u7eb8\u548c\u6742\u5fd7\u7684\u8ba2\u9605\u662f\u600e\u4e48\u56de\u4e8b:<\/p>\n<ol>\n<li>\u62a5\u793e\u7684\u4e1a\u52a1\u5c31\u662f\u51fa\u7248\u62a5\u7eb8\u3002<\/p>\n<\/li>\n<li>\n<p>\u5411\u67d0\u5bb6\u62a5\u793e\u8ba2\u9605\u62a5\u7eb8,\u53ea\u8981\u4ed6\u4eec\u6709\u65b0\u62a5\u7eb8\u51fa\u7248,\u5c31\u4f1a\u7ed9\u4f60\u9001\u6765\u3002<\/p>\n<p>\u53ea\u8981\u4f60\u662f\u4ed6\u4eec\u7684\u8ba2\u6237,\u4f60\u5c31\u4f1a\u4e00\u76f4\u6536\u5230\u65b0\u62a5\u7eb8\u3002<\/p>\n<\/li>\n<li>\n<p>\u5f53\u4f60\u4e0d\u60f3\u518d\u770b\u62a5\u7eb8\u7684\u65f6\u5019,\u53d6\u6d88\u8ba2\u9605,\u4ed6\u4eec\u5c31\u4e0d\u4f1a\u518d\u9001\u65b0\u62a5\u7eb8\u6765\u3002<\/p>\n<\/li>\n<li>\n<p>\u53ea\u8981\u62a5\u793e\u8fd8\u5728\u8fd0\u8425,\u5c31\u4f1a\u4e00\u76f4\u6709\u4eba(\u6216\u5355\u4f4d)\u5411\u4ed6\u4eec\u8ba2\u9605\u62a5\u7eb8\u6216\u53d6\u6d88\u8ba2\u9605\u62a5\u7eb8\u3002<\/p>\n<\/li>\n<\/ol>\n<p><strong>\u5b9a\u4e49\u89c2\u5bdf\u8005\u6a21\u5f0f<\/strong><\/p>\n<blockquote><p>\n  <strong>\u89c2\u5bdf\u8005\u6a21\u5f0f<\/strong>\uff1a\u5b9a\u4e49\u4e86\u5bf9\u8c61\u4e4b\u95f4\u7684\u4e00\u5bf9\u591a\u4f9d\u8d56\uff0c\u8fd9\u6837\u4e00\u6765\uff0c\u5f53\u4e00\u4e2a\u5bf9\u8c61\u6539\u53d8\u72b6\u6001\u65f6\uff0c\u5b83\u7684\u6240\u6709\u4f9d\u8d56\u8005\u90fd\u4f1a\u6536\u5230\u901a\u77e5\u5e76\u81ea\u52a8\u66f4\u65b0\u3002<\/p>\n<p>  \u89c2\u5bdf\u8005\u6a21\u5f0f\u5b9a\u4e49\u4e86\u4e00\u7cfb\u5217\u5bf9\u8c61\u4e4b\u95f4\u7684\u4e00\u5bf9\u591a\u5173\u7cfb\u3002<\/p>\n<p>  \u5f53\u4e00\u4e2a\u5bf9\u8c61\u6539\u53d8\u72b6\u6001\uff0c\u5176\u4ed6\u4f9d\u8d56\u8005\u90fd\u4f1a\u6536\u5230\u901a\u77e5\u3002\n<\/p><\/blockquote>\n<h3>4.2 \u677e\u8026\u5408\u7684\u5a01\u529b<\/h3>\n<p>\u5f53\u4e24\u4e2a\u5bf9\u8c61\u4e4b\u95f4\u677e\u8026\u5408,\u5b83\u4eec\u4f9d\u7136\u53ef\u4ee5\u4ea4\u4e92,\u4f46\u662f\u4e0d\u592a\u6e05\u695a\u5f7c\u6b64\u7684\u7ec6\u8282\u3002<br \/>\n\u89c2\u5bdf\u8005\u6a21\u5f0f\u63d0\u4f9b\u4e86\u4e00\u79cd\u5bf9\u8c61\u8bbe\u8ba1,\u8ba9\u4e3b\u9898\u548c\u89c2\u5bdf\u8005\u4e4b\u95f4\u677e\u8026\u5408\u3002<\/p>\n<p>\u5173\u4e8e\u89c2\u5bdf\u8005\u7684\u4e00\u5207,\u4e3b\u9898\u53ea\u77e5\u9053\u89c2\u5bdf\u8005\u5b9e\u73b0\u4e86\u67d0\u4e2a\u63a5\u53e3(\u4e5f\u5c31\u662fObserver\u63a5\u53e3)\u3002\u4e3b\u9898\u4e0d\u9700\u8981\u77e5\u9053\u89c2\u5bdf\u8005\u7684\u5177\u4f53\u7c7b\u662f\u8c01\u3001\u505a\u4e86\u4e9b\u4ec0\u4e48\u6216\u5176\u4ed6\u4efb\u4f55\u7ec6\u8282\u3002<br \/>\n\u4efb \u4f55 \u65f6 \u5019 \u6211 \u4eec \u90fd \u53ef \u4ee5 \u589e \u52a0 \u65b0 \u7684 \u89c2 \u5bdf \u8005 \u3002 \u56e0 \u4e3a \u4e3b \u9898 \u552f \u4e00 \u4f9d \u8d56 \u7684 \u4e1c \u897f \u662f \u4e00 \u4e2a \u5b9e \u73b0Observer\u63a5\u53e3\u7684\u5bf9\u8c61\u5217\u8868,\u6240\u4ee5\u6211\u4eec\u53ef\u4ee5\u968f\u65f6\u589e\u52a0\u89c2\u5bdf\u8005\u3002\u4e8b\u5b9e\u4e0a,\u5728\u8fd0\u884c\u65f6\u6211\u4eec\u53ef\u4ee5\u7528\u65b0\u7684\u89c2\u5bdf\u8005\u53d6\u4ee3\u73b0\u6709\u7684\u89c2\u5bdf\u8005,\u4e3b\u9898\u4e0d\u4f1a\u53d7\u5230\u4efb\u4f55\u5f71\u54cd\u3002\u540c\u6837\u7684,\u4e5f\u53ef\u4ee5\u5728\u4efb\u4f55\u65f6\u5019\u5220\u9664\u67d0\u4e9b\u89c2\u5bdf\u8005\u3002<\/p>\n<p>\u6539\u53d8\u4e3b\u9898\u6216\u89c2\u5bdf\u8005\u5176\u4e2d\u4e00\u65b9,\u5e76\u4e0d\u4f1a\u5f71\u54cd\u53e6\u4e00\u65b9\u3002\u56e0\u4e3a\u4e24\u8005\u662f\u677e\u8026\u5408\u7684,\u6240\u4ee5\u53ea\u8981\u4ed6\u4eec\u4e4b\u95f4\u7684\u63a5\u53e3\u4ecd\u88ab\u9075\u5b88,\u6211\u4eec\u5c31\u53ef\u4ee5\u81ea\u7531\u5730\u6539\u53d8\u4ed6\u4eec\u3002<\/p>\n<blockquote><p>\n  \u8bbe\u8ba1\u539f\u5219\uff1a\u4e3a\u4e86\u4ea4\u4e92\u5bf9\u8c61\u4e4b\u95f4\u7684\u677e\u8026\u5408\u8bbe\u8ba1\u800c\u52aa\u529b\n<\/p><\/blockquote>\n<h2>5.\u91cd\u65b0\u5f00\u59cb\u5f00\u53d1<\/h2>\n<h3>5.1 \u8bbe\u8ba1\u6c14\u8c61\u7ad9<\/h3>\n<p><img decoding=\"async\" src=\"http:\/\/cos.rain1024.com\/markdown\/image-20190926201042442.png\" alt=\"\" \/><\/p>\n<h3>5.2 \u5b9e\u73b0\u6c14\u8c61\u7ad9<\/h3>\n<p>\u4f9d\u7167\u524d\u9762\u7684\u7c7b\u56fe\uff0c\u5f00\u59cb\u7f16\u5199\u6c14\u8c61\u7ad9\u7684\u4ee3\u7801<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/cos.rain1024.com\/markdown\/image-20190927155911379.png\" alt=\"\" \/><\/p>\n<pre><code>public interface Subject {\n\/\/    \u7528\u6765\u6ce8\u518c\u6216\u5220\u9664\u89c2\u5bdf\u8005\n    public void registerObserver(Observer o);\n    public void removeObserver(Observer o);\n\/\/    \u5f53\u4e3b\u9898\u72b6\u6001\u6539\u53d8\u65f6\uff0c\u8c03\u7528\u6b64\u65b9\u6cd5\u901a\u77e5\u6240\u6709\u89c2\u5bdf\u8005\n    public void notifyObservers();\n}\n\n<\/code><\/pre>\n<pre><code>public interface Observer {\n\/\/    \u4f46\u6c14\u8c61\u89c2\u6d4b\u503c\u6539\u53d8\u65f6\uff0c\u4e3b\u9898\u4f1a\u628a\u8fd9\u4e9b\u72b6\u6001\u503c\u5f53\u4f5c\u65b9\u6cd5\u7684\u53c2\u6570\uff0c\u4f20\u9012\u7ed9\u89c2\u5bdf\u8005\n    public void update(float temp,float humidity,float pressure);\n}\n\n<\/code><\/pre>\n<pre><code>public interface DisplayElement {\n\/\/    DisplayElement\u63a5\u53e3\u53ea\u5305\u542b\u4e86\u4e00\u4e2a\u65b9\u6cd5, \u4e5f\u5c31\u662fdisplay()\u3002\u5f53\u5e03\u544a\u677f\u9700\u8981\u663e\u793a\u65f6, \u8c03\u7528\u6b64\u65b9\u6cd5\u3002\n    public void display();\n}\n\n<\/code><\/pre>\n<pre><code>\/\/WeatherData\u73b0\u5728\u5b9e\u73b0\u4e86Subject\u63a5\u53e3\u3002\npublic class WeatherData implements Subject {\n\n\/\/    \u6211\u4eec\u52a0\u4e0a\u4e00\u4e2aArrayList\u6765\u7eaa\u5f55\u89c2\u5bdf\u8005,\u6b64ArrayList\u662f\u5728\u6784\u9020\u5668\u4e2d\u5efa\u7acb\u7684\u3002\n    private ArrayList observers;\n    private float temperature;\n    private float humidity;\n    private float pressure;\n\n    public WeatherData(){\n        observers = new ArrayList();\n    }\n\n\/\/    \u5f53\u6ce8\u518c\u89c2\u5bdf\u8005\u65f6,\u6211\u4eec\u53ea\u8981\u628a\u5b83\u52a0\u5230ArrayList\u7684\u540e\u9762\u5373\u53ef\u3002\n    public void registerObserver(Observer o) {\n        observers.add(o);\n    }\n\n\/\/    \u5f53\u89c2\u5bdf\u8005\u60f3\u53d6\u6d88\u6ce8\u518c,\u6211\u4eec\u628a\u5b83\u4eceArrayList\u4e2d\u5220\u9664\u5373\u53ef\u3002\n    public void removeObserver(Observer o) {\n        int i = observers.indexOf(o);\n        if (i&gt;=0){\n            observers.remove(o);\n        }\n    }\n\n\/\/    \u6211\u4eec\u628a\u72b6\u6001\u544a\u8bc9\u6bcf\u4e00\u4e2a\u89c2\u5bdf\u8005\u3002\n    public void notifyObservers() {\n        for (int i = 0 ;i &lt; observers.size(); i++){\n            Observer observer = (Observer) observers.get(i);\n            observer.update(temperature,humidity,pressure);\n        }\n    }\n\/\/    \u5f53\u4ece\u6c14\u8c61\u7ad9\u5f97\u5230\u66f4\u65b0\u89c2\u6d4b\u503c\u65f6,\u6211\u4eec\u901a\u77e5\u89c2\u5bdf\u8005\u3002\n    public void measurementsChanged(){\n        notifyObservers();\n    }\n\n\/\/    \u8bbe\u7f6e\u6570\u636e\n    public void setMeasurements(float temperature,float humidity,float pressure){\n        this.temperature = temperature;\n        this.humidity = humidity;\n        this.pressure = pressure;\n        measurementsChanged();\n    }\n}\n<\/code><\/pre>\n<pre><code>\/\/\u5e03\u544a\u677f\u5b9e\u73b0\u4e86Observer\u63a5\u53e3,\u6240\u4ee5\u53ef\u4ee5\u4eceWeatherData\u5bf9\u8c61\u4e2d\u83b7\u5f97\u6539\u53d8\npublic class CurrentConditionsDisplay implements Observer,DisplayElement{\n\n    private float temperature;\n    private float humidity;\n    private Subject weatherData;\n\n\/\/    \u6784\u9020\u5668\u9700\u8981 weatherData\u5bf9\u8c61(\u4e5f\u5c31\u662f\u4e3b\u9898)\u4f5c\u4e3a\u6ce8\u518c\u4e4b\u7528\u3002\n    public CurrentConditionsDisplay(Subject weatherData){\n        this.weatherData = weatherData;\n        weatherData.registerObserver(this);\n    }\n\n\n    public void display() {\n        System.out.println(temperature+\"\"+humidity);\n    }\n\n\/\/    \u5f53update()\u88ab\u8c03\u7528\u65f6,\u6211\u4eec\u628a\u6e29\u5ea6\u548c\u6e7f\u5ea6\u4fdd\u5b58\u8d77\u6765, \u7136\u540e\u8c03\u7528display()\u3002\n    public void update(float temp, float humidity, float pressure) {\n\n        this.temperature = temp;\n        this.humidity = humidity;\n        display();\n    }\n}\n<\/code><\/pre>\n<pre><code>public class WeatherStation {\n    public static void main(String[] args) {\n        WeatherData weatherData = new WeatherData();\n        CurrentConditionsDisplay currentConditions = new CurrentConditionsDisplay(weatherData);\n        weatherData.setMeasurements(80,65,20);\n    }\n}\n\n<\/code><\/pre>\n<p>\u8fd0\u884cWeatherStation\u53ef\u4ee5\u5f97\u5230\u7ed3\u679c\uff0c\u7531\u6b64\u6574\u4e2a\u4ee3\u7801\u7f16\u5199\u5b8c\u6210\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u300aHeadFirst\u8bbe\u8ba1\u6a21\u5f0f\u300b\u7b2c\u4e8c\u7ae0\u89c2\u5bdf\u8005\u6a21\u5f0f-\u8bfb\u4e66\u7b14\u8bb0 \u6848\u4f8b\u4ee3\u7801\u94fe\u63a5\uff1ahttps:\/\/github.com\/\u2026 <span class=\"read-more\"><a href=\"http:\/\/rain1024.com\/index.php\/2019\/09\/27\/%e3%80%8aheadfirst%e8%ae%be%e8%ae%a1%e6%a8%a1%e5%bc%8f%e3%80%8b%e7%ac%ac%e4%ba%8c%e7%ab%a0%e8%a7%82%e5%af%9f%e8%80%85%e6%a8%a1%e5%bc%8f-%e8%af%bb%e4%b9%a6%e7%ac%94%e8%ae%b0\/\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23],"tags":[91],"class_list":["post-1070","post","type-post","status-publish","format-standard","hentry","category-23","tag-91"],"_links":{"self":[{"href":"http:\/\/rain1024.com\/index.php\/wp-json\/wp\/v2\/posts\/1070","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/rain1024.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/rain1024.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/rain1024.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/rain1024.com\/index.php\/wp-json\/wp\/v2\/comments?post=1070"}],"version-history":[{"count":1,"href":"http:\/\/rain1024.com\/index.php\/wp-json\/wp\/v2\/posts\/1070\/revisions"}],"predecessor-version":[{"id":1377,"href":"http:\/\/rain1024.com\/index.php\/wp-json\/wp\/v2\/posts\/1070\/revisions\/1377"}],"wp:attachment":[{"href":"http:\/\/rain1024.com\/index.php\/wp-json\/wp\/v2\/media?parent=1070"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/rain1024.com\/index.php\/wp-json\/wp\/v2\/categories?post=1070"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/rain1024.com\/index.php\/wp-json\/wp\/v2\/tags?post=1070"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}