设计模式--构造型模式 2019-03-30 程序之旅 暂无评论 939 次阅读 ## 结构型模式 处理类与类之间的关系,继承与组合,优先使用组合。列出集合比较常见的项目构造方式,大家可以根据自己的业务需求进行选择使用。 ### 适配器模式: 已有的两个类或方法,整个使用过程新增一个类(适配器),去充当其中的一个类的实现,达到无需重复写代码的效果,简单的说就是把程序中有的东西且不能用的东西进行适配,变为能给自己用的东西。 举例:一个橘子需要被包装,包装的过程中需要更换包装箱,换成使用苹果的包装箱子,但打包的方式会改变,所以这个时候需要一个适配器来实现包装箱的打包方法。 ![设计模式.png](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/usr/uploads/2019/03/260640469.png) #### 代码演示 ```java /** * 橘子包装适配器 */ public class OrangeBagAdapter extends OrangeBag { private AppleBag appleBag; // 苹果的包装箱子 public OrangeBagAdapter(AppleBag appleBag){ this.appleBag = appleBag; // 橘子使用苹果的箱子 } @Override public void pack() { /* * 橘子的其他业务处理 */ appleBag.pack(); // 使用苹果打包的方法 } } ``` ```java // 适配器的使用 //准备用途苹果盒代替 AppleBag appleBag = new AppleBag(); //把苹果盒适配成桔子包装盒 OrangeBag orangeBag = new OrangeBagAdapter(appleBag); Orange orange = new Orange(); orange.pack(orangeBag); // 打包 ``` ### 桥接模式 假如我们需要获取一个箱子,箱子可以按照两种方式进行分类,根据大小可以分类大、中、小等,按照材质可以分为纸质、塑料、木材等材料。在创建一个箱子类的时候,我们不可能根据不同材料不同材质进行编写程序,需要编写9个类的组合,为了解决这类似的问题需要使用桥接模式进行类的组合。 ![设计模式2.png](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/usr/uploads/2019/03/3813001394.png) #### 演示代码 以箱子的大小为主要属性类,创建材质接口,进行组合。 ```java /** * 箱子容器 */ public abstract class BagAbstraction { protected Material material; // 材质接口, // protected Material material; public void setMaterial(Material material){ this.material = material; } //使用箱子的方法,采摘 public abstract void pick(); } ``` 大小箱子的继承 ``` public class BigBag extends BagAbstraction { public void pick(){ System.out.println("采摘水果开始"); this.material.draw(); System.out.println("采摘了一大袋"); } } ``` 材质接口实现 ``` /** * 纸质箱子 * Material */ public class Paper implements Material{ public void draw(){ System.out.print("用纸盒"); } } ``` 实现 ``` public class BridgeClient { public static void main(String[] args) { //袋子型号 BagAbstraction bag = new BigBag(); //袋子材质 Material material = new Paper(); bag.setMaterial(material); //开始采摘 bag.pick(); } } ``` ![设计模式3.png](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/usr/uploads/2019/03/2936009985.png) > 这是一个二维组合,如果遇到多维度的组合可以多添加接口进行实现 ### 装饰器模式 根据具体情况来添加实现方法或类。在不影响业务主流程的前提下,可以动态添加需求业务逻辑,对主流业务进行装饰,这就是装饰器模式。 举例:在之前的水果打包实现,我们需要添加一些简单的功能,比如在箱子上打防伪标识、给箱子加固、添加额外礼品等,这些功能都不是主流业务(打包)上的功能,而且并不是每一个功能都必须添加。 ![设计模式4.png](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/usr/uploads/2019/03/2351467123.png) #### 演示代码 装饰器 ``` public class BagDecorator implements Bag { private Bag bag; //维持一个对抽象构件对象的引用 public BagDecorator(Bag bag) //注入一个抽象构件类型的对象 { this.bag = bag; } public void pack() { bag.pack(); } } ``` 功能的实现 ``` public class CheckedBagDecorator extends BagDecorator { public CheckedBagDecorator(Bag bag) { super(bag); } public void pack() { super.pack(); //调用原有业务方法,主业务方法 checked(); //打印防伪标识 } //增加防伪标识 public void checked() { System.out.println("------"); System.out.println("打印上防伪标识"); } } ``` 执行代码 ```java AbstractFactory factory = new AppleFactory(); //得到水果 Fruit fruit = factory.getFruit(); fruit.draw(); //得到包装 Bag bag = factory.getBag(); //现需要增加防伪标识 bag = new CheckedBagDecorator(bag);//防伪功能 bag = new ReinforceBagDecorator(bag);//加固功能 // bag = new SpeedDecorator(bag);//加急功能 bag.pack(); // 打包 ``` ### 代理模式 把两个不能直接发生关系的对象进行联合,一个类代表另一个类的功能。 实现与装饰器类似。 ##### 不同之处 - 代理模式中对象是唯一 - 代理模式是把功能转移,装饰器模式是功能的增强。 举例:水果需要海外获取,需要在海外进行采摘和打包,实现海外下订单。 演示代码 ```java public class ProxyOrder implements OrderService { //真实的订单服务 private OrderService orderService = new OutOrderServiceImpl(); @Override public int saveOrder() { System.out.println("开始海外下订单"); return orderService.saveOrder(); } public static void main(String[] args){ saveOrder(); } public static void saveOrder(){ //本地代理类 OrderService orderService = new ProxyOrder(); orderService.saveOrder(); //其它业务代码。。。。 } } ``` ### 外观模式 外观服务在实际开发中比较常见,如果功能方法实现已经固定,可以把所有的方法按顺序放到一个类中,在用户调用的时候不需要关心底层的业务实现,只需要调用外观服务类就行。 ![设计模式5.png](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/usr/uploads/2019/03/1606343706.png) #### 部分实例代码 ```java /** * 客户服务一条龙 */ public class OrderFacade { private PickService pickService; private PackService packService; private SendService sendService; public OrderFacade(){ pickService = new PickService(); packService = new PackService(); sendService = new SendService(); } /** * 客户订单处理类 */ public void doOrder(){ //采摘 System.out.println("--------------"); pickService.doPick(); //包装 System.out.println("--------------"); packService.doPack(); //快递 System.out.println("--------------"); sendService.doSend(); } } ``` 打赏: 微信, 支付宝 标签: java, 设计模式 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。