From 99cc81cae1e765bdb331e7f1ab906c6df5d984c9 Mon Sep 17 00:00:00 2001 From: wangjiashuo <1443062665@qq.com> Date: Sun, 31 May 2026 13:45:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20w10=20ArticleRepository=20?= =?UTF-8?q?=E4=B8=8E=20AnalyzeCommand=20=E7=BB=83=E4=B9=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- w10/AnalyzeCommand.class | Bin 0 -> 2006 bytes w10/AnalyzeCommand.java | 69 ++++++++++++++++++++++++++++ w10/ArticleRepository$Article.class | Bin 0 -> 452 bytes w10/ArticleRepository.class | Bin 0 -> 2384 bytes w10/ArticleRepository.java | 56 ++++++++++++++++++++++ w10/BlogStrategy.class | Bin 0 -> 460 bytes w10/NewsStrategy.class | Bin 0 -> 460 bytes w10/ParseStrategy.class | Bin 0 -> 193 bytes w10/思考题.txt | 11 +++++ 9 files changed, 136 insertions(+) create mode 100644 w10/AnalyzeCommand.class create mode 100644 w10/AnalyzeCommand.java create mode 100644 w10/ArticleRepository$Article.class create mode 100644 w10/ArticleRepository.class create mode 100644 w10/ArticleRepository.java create mode 100644 w10/BlogStrategy.class create mode 100644 w10/NewsStrategy.class create mode 100644 w10/ParseStrategy.class create mode 100644 w10/思考题.txt diff --git a/w10/AnalyzeCommand.class b/w10/AnalyzeCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..3227a7db8c5e1ae97aab922cf721ac0f6c231476 GIT binary patch literal 2006 zcmaJ?TTfh76#n)w<;>+2>Og4`TY=J+VSs_sQe}V&(<0~$#d4`os~(13I52b0IOj|S z6HOY8@j(+4>xITt8`BUUl+-9!Z%>-|7ktG5U-aF?%i42>az@aXv-d34{?@m?b>XMK z*1iRB0Vxk0D3IWku@8j|2d0(lN-(ZylfjGQ(>!J}6t=6HYIZUd)cQxC0|a9d7*`S@7an9d{Ois6 zt;NOPzrHnmDYCKh*4C@vY^LG-$w?1A#ZXr3x5?3$vxmH>g3!nZ+2BZ3T0jSLK>+o-mZg(NgH>>p541}CPX9CKbYp+&}NoFP(1I+@f{CRJ$9 ztj1h8%W(3(aGCc%&fHwgym@15@h*wDdF!>Ug-`-96{{Wo z1GvwH4x-%A(NX!!8?Ot5^>;G2KddB!kGk=kjK|Q$a44b7P)BJo#k{PVQ*<*-MH6&S z>{W!_b@72AEWpkSB7HgC?Uj?z!ytFZ^~r64JTwe62YqDj=Pw#N=3W$tDo12Q(a+$} zuQ9aRd02B2veC#{?DfvIzY7Cm(4L}x%R%f6hkwL{L57Mc(@eGngM3y=B;&j>rYC~q zL^RlZs>MUoH!NdBG_1sDc`R*m2KS&ksVQbUMfWOOkBOM=k-RntbyAg_VSR#JizBMW z`_qYWo*Gid<7BD%H>cgN{Ug*_gQgOji7Lt5GiO3kX+p|suh=xWKO(df2K96*#(Pu| zqa=T0G>U$w$?n#5)1Y2WM!7kqPZ%!5X!B6FwN)|~1l!H^kG4L)v+>=X%#B4d78hdD zgDI#IrbVe~W7K44CtGG!yROghphd!Jr5+_lb2!KFfxUP+M=NSCt*|&ZY9hKmlTO+z zn#;zPU*5x^xg_7i-L6M|PuNL@m3VxR_5@W%?$b1$3da@0;D!Ve_4uxw_M$2w$#C@l zT}e(WFH}(%IcVN!+lVbr=Vkikz|$z8J9Q`BN6Au0r||RCErZnszJhcw`)Z87MdS+{ zgA+Ay)AF+ruF!jGPWp=XztQV`biNY!0iM7T_RmB90wuokB~;vF(Yh}ot)hydzhM<8 z8Rk(jXcYkU^!G;`=oEY^}>%5%B~a*D5Gt98bO?+E!K@@S^_QT#Ti7rZ$kG)btf`2!A_bhwIVbGi4BK0=}DbzB%-#^dYgrQ?Ye zJQ-PsYc#Noi_v=Dr6mmQXzC+1fiA-CMg_uDr}KpI9N8Rr9txdBbh}0o# strategies; + + public AnalyzeCommand(List strategies) { + this.strategies = strategies; + } + + public void execute(String url) { + if (url == null || url.isBlank()) { + System.out.println("错误:URL不能为空"); + return; + } + + ParseStrategy matchedStrategy = null; + for (ParseStrategy strategy : strategies) { + if (strategy.supports(url)) { + matchedStrategy = strategy; + break; + } + } + + if (matchedStrategy == null) { + System.out.println("错误:无支持该URL的解析策略"); + return; + } + + int stats = matchedStrategy.analyze(url); + System.out.println("=== 分析结果 ==="); + System.out.println("URL: " + url); + System.out.println("统计信息: " + stats); + } + + public static void main(String[] args) { + List strategies = List.of(new BlogStrategy(), new NewsStrategy()); + AnalyzeCommand cmd = new AnalyzeCommand(strategies); + cmd.execute("http://example.com/blog/123"); + } +} diff --git a/w10/ArticleRepository$Article.class b/w10/ArticleRepository$Article.class new file mode 100644 index 0000000000000000000000000000000000000000..10525ae83bed9477e9214f57d4219684671bbb53 GIT binary patch literal 452 zcmZXQ!AiqG5QhIrnkJ3W+S*im5JWws5$ppff)queRIsJ@G%jIFOeEO~zLkO^c<=#y zC~;B)g1OA>{QJ$%%zS-+d;+*Y&xQuwM9qPLI$?7WJO+a}NTR{bd?7+bsGrJ2sxyM_ z^=A!OXqd1atid7l&NC&$Slo(-G?yyPo(@ZeU?{0#L1>TuJSQrXNpwPRy{g)u5o*Kq zj(eITnTYZ7elD_UFfUxJNT}(rVaMxNn+f(LU1p)Ulm*_c40c>h!9HV=tE)6uCc1=H z1tU1uNg}dg9OSvk31*34k5||DXvC41=a%xQcVjIYz6#ao38EB&2G$Ykm3it z!N~aWqNB_>gAOyD(FehimQqK3^1;7@RG#$Ran#@4Y}EP|=7cftLQfYh+CQn4Ys8!?p9%0zs`La~LbN;zznjhS7qE zg0(8vp;e%<@|Xa$@o|CHXvwY&WHNR#jP-a(LA#0#cvxWFitT`HnoPv7Edj-F4rX&M zaWEOrW}}Ktc$BydSI=w2D9{#-l_4AS7qS&6WuLjRMRGpwI;rS4W0 zParA~uqYs+C9mbU6?6%-SJBkzOG4zcTe8t3uqm4QU%g~(MDm}IMSPMDeTKXWt)x#a z$?$d+J7lTXurgX+hG5-xVYh;(RqVmuiY7=;JFcE3U3P&vw3c`=?8MQ$VYz8HuWQ+4 z5c>o=`uh4h7H?g-_uZ!*RXF8g2>bDjf@f9qt4YJBkcKLn&q-DTcd-119+wKg9mYx_!d9A^!vBhdP9iem}L7v1OllbUS2-iE-MiU;+18| z4$1LJ6{lov>e$0X9pSZ0MNo^BKz-Vnur#-jC(53(&Xbw!TczmxlT2>F9;aDT%CPj| zLUv5gAJ@iAN*dCxmYEvTa{m9W2lvG4{$nEoi7Iwiw;`siX0U>7(Nkp?b-9EBp|oAd zXY@mc#MxHWEZgM85(p3Ljyt5wl;o^9VB4odh0 zAOHE|RS^UOw=d2u6hF9j_x8oRx4$WV@=^J5Zuz)){c80wZ~yvxKVMp0xNa3pv%lx3-_4r!Uv$osr}VEKxrEDmedxT!mxDchbZ z>dPK!TX#|tE;l>OBr%1hS~Vwor%aNg8S?ItHB$n<2PR*uBR#K=FJe?o4e*9x)z|E zm_z+7glNcXDFJC=$yy@Hg!Hgv}UoRj`zMo2c zkDZa^Ec&>|XE893=LPQIMS!yS0%9j3N9OPn^R84#dkTKhhPpk)#~6JI3ZYR articles = new ArrayList<>(); + + public void add(Article article) { + if (article != null) { + articles.add(article); + } + } + + public void addAll(Collection
newArticles) { + if (newArticles == null || newArticles.isEmpty()) { + return; + } + for (Article article : newArticles) { + add(article); + } + } + + public List
getAll() { + return new ArrayList<>(articles); + } + + public void clear() { + articles.clear(); + } + + static class Article { + private String title; + public Article(String title) { this.title = title; } + public String getTitle() { return title; } + } + + public static void main(String[] args) { + ArticleRepository repo = new ArticleRepository(); + System.out.println("=== 测试 ArticleRepository ==="); + System.out.println("初始大小:" + repo.getAll().size()); + + repo.add(new Article("文章1")); + System.out.println("添加一个后大小:" + repo.getAll().size()); + + ArrayList
list = new ArrayList<>(); + list.add(new Article("文章2")); + list.add(null); + list.add(new Article("文章3")); + repo.addAll(list); + System.out.println("添加多个后大小:" + repo.getAll().size()); + + repo.addAll(null); + System.out.println("过滤null后大小:" + repo.getAll().size()); + } +} diff --git a/w10/BlogStrategy.class b/w10/BlogStrategy.class new file mode 100644 index 0000000000000000000000000000000000000000..0f00b22f2494a02ea6656473acfb7c4d2bfe1469 GIT binary patch literal 460 zcmZvY%Syvg5QhJ0YEMj4d$ZoE=(1I?51Yd<+4 z7_Ih|36qd_g2=OAp(tS6C}H8(U_Xg{?Ga2j(uwr-n9ywXeuTR>GVZI}RB2c3wXX## z1pA03c~B?x~k zKZ71QAS|-Y+JMQnfhD#Xy2%nb_F|_do-qHw;VfL_Y#A$G@H+bp&R321zhs4btK7?B F?GyauTZ#Yx literal 0 HcmV?d00001 diff --git a/w10/NewsStrategy.class b/w10/NewsStrategy.class new file mode 100644 index 0000000000000000000000000000000000000000..1d342ca5ca7b4126525b4a7e5751547254df6916 GIT binary patch literal 460 zcmZut%Sr=55UkF|%(`yOON|;ukBNf$07Z~RK?qTZcLf6Vm7^)$3r8cVdwb^V*hYa*MJVyzEPi}0t}2W+Ig{z^ zJcAw?5SBQaF&MEaRyZ2!7E5F}i`}w#!u$inS#p)DDptS98=MU}TN3YonP#@evkcZh E0Y`LO%m4rY literal 0 HcmV?d00001 diff --git a/w10/ParseStrategy.class b/w10/ParseStrategy.class new file mode 100644 index 0000000000000000000000000000000000000000..44be50280e2626f1953565829494a497214e7232 GIT binary patch literal 193 zcmX^0Z`VEs1_oCKZgvJHMh4!1#G>NV;F6-mlGOA{b_Nzk27#=^vPAuy#JqHU|D>$c zj$>e80=k2h0Vn{Z*%>&1B8&{2AaMpR04`}T A3IG5A literal 0 HcmV?d00001 diff --git a/w10/思考题.txt b/w10/思考题.txt new file mode 100644 index 0000000..eb3f1fc --- /dev/null +++ b/w10/思考题.txt @@ -0,0 +1,11 @@ +两个策略都  supports  同一URL时怎么办? + +当多个策略都匹配同一URL时,会出现策略冲突,导致解析逻辑不确定。解决方案如下: + +1. 策略优先级排序:为每个策略设置明确的优先级(如数字权重),匹配时按优先级从高到低查找,优先使用优先级高的策略。 +​ +2. 匹配规则互斥设计:调整各策略的URL匹配规则,避免出现交叉匹配的情况,例如使用更精确的正则表达式,确保一个URL只被一个策略匹配。 +​ +3. 冲突处理机制:在代码中检测到多个匹配策略时,抛出异常并提示冲突,或让用户手动选择策略。 +​ +4. 策略注册顺序约定:若未设置优先级,按策略注册的先后顺序匹配,先注册的策略优先生效,但这种方式可读性较差,不推荐使用。 \ No newline at end of file