从头认识设计模式-策略模式-05-引入设计原则:面向接口编程
Posted 李灵晖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从头认识设计模式-策略模式-05-引入设计原则:面向接口编程相关的知识,希望对你有一定的参考价值。
这一章节我们来讨论一下怎么解决上一章节扩展性差的问题。
1.解决方案
面向接口编程
2.思路
使用java的多态性,动态的设置导入导出的行为
3.代码清单
在Base里面使用导入导出的接口,然后增加一个通用的导出导入方法,下面的实现中,我们只需要设置不同的导入导出行为,即可通过导入导出方法来实现不同的导入导出结果。
package com.raylee.designpattern.strategy.ch05; /** * 1.0 这个类是我们需要使用设计模式改进的原始类,也就是策略模式应用的初始环境。<br> * 1.1 使用导入导出的接口 * * @author raylee * @data 2016-03-16 * @version 1.1 */ public class BaseServiceImpl { private Export exportObject; private Import importObject; public void setExportObject(Export exportObject) { this.exportObject = exportObject; } public void setImportObject(Import importObject) { this.importObject = importObject; } public void add() { System.out.println("add a new object"); } public void update() { System.out.println("update object"); } public void query() { System.out.println("query and return a object"); } public void delete() { System.out.println("delete the object"); } public void exportObject() { exportObject.exportObject(); } public void importObject() { importObject.importObject(); } }
继承Base的实现:
package com.raylee.designpattern.strategy.ch05; /** * @TODO 1.0 用于用户的增删改查 * @author raylee * @date 2016年3月16日 * @version 1.0 */ public class UserServiceImpl extends BaseServiceImpl { }
package com.raylee.designpattern.strategy.ch05; /** * @TODO 1.0 用于部门的增删改查 * @author raylee * @date 2016年3月16日 * @version 1.0 */ public class DeptServiceImpl extends BaseServiceImpl { }
package com.raylee.designpattern.strategy.ch05; /** * @TODO 1.0 用于课程的增删改查 * * @author raylee * @date 2016年3月16日 * @version 1.0 */ public class CourseServiceImpl extends BaseServiceImpl { }
下面是导入导出接口:
package com.raylee.designpattern.strategy.ch05; public interface Import { public void importObject(); }
package com.raylee.designpattern.strategy.ch05; public interface Export { public void exportObject(); }
各种的导入导出行为的实现:
package com.raylee.designpattern.strategy.ch05; public class ImportUser implements Import { public void importObject() { importUser(); } private void importUser() { System.out.println("import users"); } }
package com.raylee.designpattern.strategy.ch05; public class ImportDept implements Import { public void importObject() { importDept(); } private void importDept() { System.out.println("import depts"); } }
package com.raylee.designpattern.strategy.ch05; public class ImportCourse implements Import { public void importObject() { importCourse(); } private void importCourse() { System.out.println("import courses"); } }
package com.raylee.designpattern.strategy.ch05; public class ExportUser implements Export { public void exportObject() { exportUser(); } private void exportUser() { System.out.println("export users"); } }
package com.raylee.designpattern.strategy.ch05; public class ExportDept implements Export { public void exportObject() { exportDept(); } private void exportDept() { System.out.println("export depts"); } }
package com.raylee.designpattern.strategy.ch05; public class ExportCourse implements Export { public void exportObject() { exportCourse(); } private void exportCourse() { System.out.println("export courses"); } }
在Client里面测试方法,这次需要在每次导出之前都必须设置相应的导出导入行为
package com.raylee.designpattern.strategy.ch05; public class Client { // 对用户、部门、课程进行增删改查 public static void main(String[] args) { CourseServiceImpl courseServiceImpl = new CourseServiceImpl(); courseServiceImpl.setExportObject(new ExportCourse()); courseServiceImpl.setImportObject(new ImportUser()); courseServiceImpl.importObject(); courseServiceImpl.exportObject(); UserServiceImpl userServiceImpl = new UserServiceImpl(); userServiceImpl.setExportObject(new ExportUser()); userServiceImpl.setImportObject(new ImportUser()); userServiceImpl.importObject(); userServiceImpl.exportObject(); DeptServiceImpl deptServiceImpl = new DeptServiceImpl(); deptServiceImpl.setExportObject(new ExportDept()); deptServiceImpl.setImportObject(new ImportDept()); deptServiceImpl.importObject(); deptServiceImpl.exportObject(); } }
输出:
import users
export courses
import users
export users
import depts
export depts
4.总结:
其实无论是分离原则还是面向接口编程的原则,都是策略设计模式的一部分,先分离后面向接口,这就是使用策略设计模式的过程。
因此,策略设计模式的概念是定义一系列的算法,把每一个算法封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
5.优点与缺点
优点:可扩展性好。当我们再次增加新的模块的导出时,不需要改动原来的代码,只需要增加一个新的导入导出行为类即可,然后client端通过设置行为的不同来确定不同的导入导出结果。
缺点:代码的增加
因此,判断使用设计模式的标准,笔者认为,就是该功能的变化的程度会是多少?变化多的,像上面的导入导出,每一个模块的结果都是不一样的,这个时候使用设计模式,就是比较切当的,如果变化较少,类似上面的增删改查,就没什么必要了,因为增加了不少的代码量。
6.更多的使用场景
不同的查找、排序方法,当然如果硬要分的话,上面的增删改查也可以分出几个来,因为现在市面上的数据库不一样,我们可以根据不同的数据库来区分存储行为
总结:这一章节展现了策略模式的另一个重要的过程-面向接口编程。
目录:
我的github:https://github.com/raylee2015/designpattern
以上是关于从头认识设计模式-策略模式-05-引入设计原则:面向接口编程的主要内容,如果未能解决你的问题,请参考以下文章