关于使用设计模式来写出好代码( 设计模式,是设计类的技巧 不是new对象的技巧)
这篇文章是沉淀写代码的思路是工程领域写好代码的沉淀。前面已经了解到面向对象的代码相关对于一个类成员变量方法构造方法集合泛型用来装更多的变量对于多个类之间的关系组合内部类继承多态接口实现。我们也知道这个东西创造出来。是为了把一大堆程序解耦。我们学习这个就是为了把程序代码解耦。在写代码时候合适的时候创建类合适的时候使用类的方法。解耦代码当然这是解耦的艺术。写好代码还有其他的比方说优雅的取变量名字。这里在说一个概念。就是设计模式。这里就不讲设计模式是什么了。那玩意很多人都写过介绍过介绍完也记不住就是没抓住核心的概念。设计模式23个主要分为3类1.创造类创建模式2.写代码技巧结构型模式3.行为型模式我下午花时间研究了一下结构型模式。这里就直接点破这个设计模式的核心的点。设计模式是设计类的技巧不是new对象的技巧写出优雅的代码使用面向对象提供的组合继承多态接口。其实还不够。业务场景很复杂。这里可以学习一下设计模式提供的思路和方法。这个结构型设计模式我们写代码是怎么写的写类模板然后在其他工作类上面写对象然后用对象调用类提供的方法和成员变量。但是想要在这个层面玩出花来就要学习设计模式了。使用结构公共复用代理模式直接使用spring提供的aop就好了底层已经实现了动态代理纯粹复杂“”桥接模式解决的是两个维度的类变化不确定的问题。这样的需求其实不多小需求多写点代码就能解决这个本质上是两个类有公共点不变的东西并且相互有关系使用成员变量构造器方法。在创建对象的时候更有规律使用结构提供入口适配器模式使用方法重载解决接口不兼容的问题外观模式他核心解决的就是让类变成一个大的入口。只要传参进来就可以处理大量的功能。使用结构让类承载更多的数据。装饰器模式增加数据用成员变量构造器和方法实现多继承的效果组合模式增加数据他的核心就是让类变成一个更复杂的数据结构。一个类里面有其他类的对象作为成员变量然后写个方法可以往这个类实例化的对象里增加成员变量的对象。补充什么是“结构型模式”结构型模式关注“类与对象如何组合成更大的结构”同时保持结构的灵活和高效。核心技巧用组合 接口 委托代替直接继承带来的强耦合。使用结构公共复用代理模式直接使用spring提供的aop就好了底层已经实现了动态代理补充代码示意JDK动态代理// 公共接口interfaceUserService{voidsaveUser(Stringname);}// 真实类classUserServiceImplimplementsUserService{publicvoidsaveUser(Stringname){System.out.println(保存用户name);}}// 代理增强如日志、事务InvocationHandlerhandler(proxy,method,args)-{System.out.println(开始事务);Objectresultmethod.invoke(newUserServiceImpl(),args);System.out.println(提交事务);returnresult;};UserServiceproxy(UserService)Proxy.newProxyInstance(UserService.class.getClassLoader(),newClass[]{UserService.class},handler);proxy.saveUser(小明);这里你已经不需要手动写代理类 —— Spring AOP 底层就是这样帮你生成代理对象从而实现“公共复用”日志、缓存、权限。纯粹复杂“”桥接模式解决的是两个维度的类变化不确定的问题。这样的需求其实不多小需求多写点代码就能解决这个本质上是两个类有公共点不变的东西并且相互有关系使用成员变量构造器方法。在创建对象的时候更有规律补充例子形状 颜色interfaceColor{Stringfill();}classRedimplementsColor{publicStringfill(){return红色;}}classBlueimplementsColor{publicStringfill(){return蓝色;}}abstractclassShape{protectedColorcolor;// 桥接持有另一个维度publicShape(Colorcolor){this.colorcolor;}abstractvoiddraw();}classCircleextendsShape{publicCircle(Colorcolor){super(color);}voiddraw(){System.out.println(圆形color.fill());}}// 使用newCircle(newRed()).draw();// 圆形红色如果不用桥接你需要写RedCircle、BlueCircle、RedSquare… 组合爆炸。桥接把“两个变化维度”分离各自独立扩展。使用结构提供入口适配器模式使用方法重载解决接口不兼容的问题补充例子电源适配器思想// 你有的接口interfaceNewSystem{voidrequest(Stringjson);}// 旧系统classOldSystem{voidspecificRequest(Stringxml){System.out.println(旧系统处理xml);}}// 适配器classAdapterimplementsNewSystem{privateOldSystemoldnewOldSystem();publicvoidrequest(Stringjson){Stringxmlconvert(json);old.specificRequest(xml);}privateStringconvert(Stringjson){returnxmljson/xml;}}适配器没有改变原有类只是加了一层转换让“不兼容的接口”能一起工作。外观模式他核心解决的就是让类变成一个大的入口。只要传参进来就可以处理大量的功能。补充例子一键下单外观classOrderFacade{publicvoidplaceOrder(StringproductId,intcount){newStockService().check(productId);newPaymentService().pay(productId,count);newLogisticsService().ship(productId);System.out.println(下单完成);}}// 客户端只调用这一行newOrderFacade().placeOrder(book001,1);外观模式不消灭背后的复杂而是给你一个简单的遥控器。使用结构让类承载更多的数据。装饰器模式增加数据用成员变量构造器和方法实现多继承的效果补充例子给咖啡加料interfaceCoffee{intcost();}classBlackCoffeeimplementsCoffee{publicintcost(){return10;}}classMilkDecoratorimplementsCoffee{privateCoffeecoffee;publicMilkDecorator(Coffeecoffee){this.coffeecoffee;}publicintcost(){returncoffee.cost()3;}}// 使用CoffeecnewMilkDecorator(newBlackCoffee());System.out.println(c.cost());// 13继承是静态的编译时装饰器是动态的运行时。你可以一层一层“包裹”对象无限扩展行为。组合模式增加数据他的核心就是让类变成一个更复杂的数据结构。一个类里面有其他类的对象作为成员变量然后写个方法可以往这个类实例化的对象里增加成员变量的对象。补充例子文件系统interfaceFileSystemNode{voidshow();}classFileimplementsFileSystemNode{privateStringname;publicFile(Stringname){this.namename;}publicvoidshow(){System.out.println(文件name);}}classFolderimplementsFileSystemNode{privateStringname;privateListFileSystemNodechildrennewArrayList();publicFolder(Stringname){this.namename;}publicvoidadd(FileSystemNodenode){children.add(node);}publicvoidshow(){System.out.println(文件夹name);for(FileSystemNodechild:children)child.show();}}// 使用FolderrootnewFolder(根目录);root.add(newFile(a.txt));FoldersubnewFolder(子目录);sub.add(newFile(b.txt));root.add(sub);root.show();这就是“类承载更多数据”的真正含义一个对象可以像容器一样装下其它同类/不同类对象形成树形结构。