一次性搞懂常见设计模式
这篇只讲“常用、能落地”的那批设计模式每个模式都给一句话场景 简洁示例代码。一、创建型怎么造对象1. 单例Singleton场景全局只要一个对象比如配置中心。publicfinalclassConfigCenter{// 饿汉式类加载即创建线程安全privatestaticfinalConfigCenterINSTANCEnewConfigCenter();privateConfigCenter(){}publicstaticConfigCentergetInstance(){returnINSTANCE;}}2. 工厂方法Factory Method场景不同类型对象的创建逻辑不一样。interfacePay{voidpay(intamount);}classWechatPayimplementsPay{publicvoidpay(intamount){}}classAliPayimplementsPay{publicvoidpay(intamount){}}classPayFactory{publicstaticPaycreate(Stringtype){returnswitch(type){casewechat-newWechatPay();casealipay-newAliPay();default-thrownewIllegalArgumentException(unknown pay);};}}3. 建造者Builder场景对象参数很多构造容易出错。classUser{privatefinalStringname;privatefinalintage;privatefinalStringemail;privateUser(Builderb){this.nameb.name;this.ageb.age;this.emailb.email;}staticclassBuilder{privateStringname;privateintage;privateStringemail;Buildername(Stringv){this.namev;returnthis;}Builderage(intv){this.agev;returnthis;}Builderemail(Stringv){this.emailv;returnthis;}Userbuild(){returnnewUser(this);}}}二、结构型怎么组织对象4. 适配器Adapter场景老接口不改包装成新接口。interfaceNewApi{Stringread();}classLegacy{StringgetText(){returnold;}}classLegacyAdapterimplementsNewApi{privatefinalLegacylegacynewLegacy();publicStringread(){returnlegacy.getText();}}5. 装饰器Decorator场景给功能加“外套”不动原类。interfaceLogger{voidlog(Stringmsg);}classConsoleLoggerimplementsLogger{publicvoidlog(Stringmsg){}}classJsonLoggerimplementsLogger{privatefinalLoggerdelegate;JsonLogger(Loggerdelegate){this.delegatedelegate;}publicvoidlog(Stringmsg){delegate.log({\msg\:\msg\});}}6. 代理Proxy场景对象访问前后要做控制或增强。interfaceService{voiddoWork();}classRealServiceimplementsService{publicvoiddoWork(){}}classAuthProxyimplementsService{privatefinalServicetarget;AuthProxy(Servicetarget){this.targettarget;}publicvoiddoWork(){// 前置校验target.doWork();// 后置审计}}三、行为型怎么协作7. 策略Strategy场景算法可替换比如不同优惠计算。interfaceDiscountStrategy{intcalc(intprice);}classVipDiscountimplementsDiscountStrategy{publicintcalc(intprice){return(int)(price*0.8);}}classNormalDiscountimplementsDiscountStrategy{publicintcalc(intprice){returnprice;}}classPriceService{privatefinalDiscountStrategystrategy;PriceService(DiscountStrategys){this.strategys;}intfinalPrice(intprice){returnstrategy.calc(price);}}8. 模板方法Template Method场景固定流程局部步骤可变。abstractclassExporter{// 固定流程publicfinalvoidexport(){readData();format();writeFile();}protectedabstractvoidformat();privatevoidreadData(){}privatevoidwriteFile(){}}classCsvExporterextendsExporter{protectedvoidformat(){}}9. 观察者Observer场景事件通知比如订单状态变化。interfaceListener{voidonEvent(Stringevent);}classEventBus{privatefinalListListenerlistenersnewArrayList();voidregister(Listenerl){listeners.add(l);}voidpublish(Stringe){listeners.forEach(l-l.onEvent(e));}}10. 责任链Chain of Responsibility场景请求一层层过滤。abstractclassHandler{protectedHandlernext;voidsetNext(Handlern){this.nextn;}abstractvoidhandle(Stringreq);}classAuthHandlerextendsHandler{voidhandle(Stringreq){// 校验if(next!null)next.handle(req);}}11. 状态State场景状态驱动行为变化。interfaceOrderState{voidnext(Orderctx);}classUnpaidimplementsOrderState{publicvoidnext(Orderctx){ctx.setState(newPaid());}}classPaidimplementsOrderState{publicvoidnext(Orderctx){ctx.setState(newShipped());}}classOrder{privateOrderStatestatenewUnpaid();voidsetState(OrderStates){this.states;}voidnext(){state.next(this);}}最后总结设计模式不是为了“背”而是为了写出可扩展、可维护的代码。遇到问题时先想一句话“我现在最想消除的复杂度是哪一类”再选对应的模式会更自然。